Skip to content

Instantly share code, notes, and snippets.

@takedasoft
Created December 10, 2008 04:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save takedasoft/34224 to your computer and use it in GitHub Desktop.
Save takedasoft/34224 to your computer and use it in GitHub Desktop.
/*
* TmpFile.scala
*
* specsのためのバグを含んだ簡単な実装です。
*/
package takedasoft
import java.io._
/**
* 一時ファイル操作のユーティリティ
*/
class TmpFile {
/**
* 一時ファイル名
*/
lazy val name:String = "_ST_" + System.currentTimeMillis + ".tmp"
/**
* 一時ファイルのFileオブジェクト
*/
lazy val file:File = new File( name )
/**
* 一時ファイルからyourFileNameへ内容をコピーする。
*/
def sinkTo(yourFileName:String):Either[File, String] = {
yourFileName match {
case "" => Right("empty file name")
case _ => Left(new File(yourFileName))
}
}
/**
* dataを一時ファイルに書き込む
*/
def write(data:String):Unit = {
val writer:Writer = new FileWriter(file)
try{
writer.write(data)
}catch{
case e:Exception => throw e
}finally{
writer.close
}
}
/**
* 一時ファイルからデータを読む
*/
def read:String = "not implemented"
/**
* 一時ファイルを削除する
*/
def destroy:Boolean = file.delete
}
/*
* TmpFileSpec.scala
* TmpFileの仕様
*/
package takedasoft
import org.specs._
import java.io.File
object TmpFileSpec extends Specification("TmpFileの仕様") {
def cannot = "このルートはありえない" must_== ""
"TmpFile" should {
"一時ファイル名" in {
"接頭が _ST_ の21文字であること" in {
val tmp = new TmpFile
tmp.name must startWith("_ST_")
tmp.name.size must_==21
tmp.destroy
}
"拡張子が .tmp であること" in {
val tmp = new TmpFile
tmp.name must endWith(".tmp")
tmp.destroy
}
}
"一時ファイルへの書き込みができること" >> {
val tmp = new TmpFile
val data = "some temporary data"
var road:String = ""
"書き込めること" >> {
tmp.write(data)
}
"読み込めること" >> {
road = tmp.read
}
"書き込んだ内容と読みこんだ内容が一致すること" >> {
data must_== road
}
tmp.destroy must_== true
}
"一時ファイルから任意のファイルに内容をコピーできること" >> {
val tmp = new TmpFile
"コピーできること" >> {
val data = "some temporary data"
val myFileName = "my-data.txt"
tmp.write(data)
tmp.sinkTo(myFileName) match{
case Left(myFile) => myFile must exist
case Right(err) => cannot
}
}
"ファイル名を指定しない場合はエラーメッセージ" >> {
tmp.sinkTo("") match{
case Left(myFile) => cannot
case Right(err) => err must_=="empty file name"
}
}
tmp.destroy must_== true
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment