176 lines
5.0 KiB
Kotlin
176 lines
5.0 KiB
Kotlin
package test.io
|
|
|
|
import org.junit.Test as test
|
|
import java.io.File
|
|
import kotlin.test.assertEquals
|
|
import java.io.Reader
|
|
import java.io.StringReader
|
|
import java.net.URL
|
|
import java.util.ArrayList
|
|
import kotlin.test.assertFalse
|
|
import kotlin.test.assertTrue
|
|
|
|
fun sample(): Reader = StringReader("Hello\nWorld");
|
|
|
|
class ReadWriteTest {
|
|
test fun testAppendText() {
|
|
val file = File.createTempFile("temp", System.nanoTime().toString())
|
|
file.writeText("Hello\n", "UTF8")
|
|
file.appendText("World\n", "UTF8")
|
|
file.appendText("Again")
|
|
|
|
assertEquals("Hello\nWorld\nAgain", file.readText())
|
|
assertEquals(listOf("Hello", "World", "Again"), file.readLines("UTF8"))
|
|
file.deleteOnExit()
|
|
}
|
|
|
|
test fun reader() {
|
|
val list = ArrayList<String>()
|
|
|
|
/* TODO would be nicer maybe to write this as
|
|
reader.lines.forEach { ... }
|
|
|
|
as we could one day maybe write that as
|
|
for (line in reader.lines)
|
|
|
|
if the for(elem in thing) {...} statement could act as syntax sugar for
|
|
thing.forEach{ elem -> ... }
|
|
|
|
if thing is not an Iterable/array/Iterator but has a suitable forEach method
|
|
*/
|
|
sample().forEachLine {
|
|
list.add(it)
|
|
}
|
|
assertEquals(arrayListOf("Hello", "World"), list)
|
|
|
|
var reader = StringReader("")
|
|
var c = 0
|
|
reader.forEachLine { c++ }
|
|
assertEquals(0, c)
|
|
|
|
reader = StringReader(" ")
|
|
reader.forEachLine { c++ }
|
|
assertEquals(1, c)
|
|
|
|
reader = StringReader(" \n")
|
|
c = 0
|
|
reader.forEachLine { c++ }
|
|
assertEquals(1, c)
|
|
|
|
reader = StringReader(" \n ")
|
|
c = 0
|
|
reader.forEachLine { c++ }
|
|
assertEquals(2, c)
|
|
}
|
|
|
|
test fun file() {
|
|
val file = File.createTempFile("temp", System.nanoTime().toString())
|
|
val writer = file.outputStream().writer().buffered()
|
|
|
|
writer.write("Hello")
|
|
writer.newLine()
|
|
writer.write("World")
|
|
writer.close()
|
|
|
|
//file.replaceText("Hello\nWorld")
|
|
file.forEachBlock { arr: ByteArray, size: Int ->
|
|
assertTrue(size >= 11 && size <= 12, size.toString())
|
|
assertTrue(arr.contains('W'.toByte()))
|
|
}
|
|
val list = ArrayList<String>()
|
|
file.forEachLine("UTF8", {
|
|
list.add(it)
|
|
})
|
|
assertEquals(arrayListOf("Hello", "World"), list)
|
|
val text = file.inputStream().reader().readText()
|
|
assertTrue(text.contains("Hello"))
|
|
assertTrue(text.contains("World"))
|
|
|
|
file.writeText("")
|
|
var c = 0
|
|
file.forEachLine { c++ }
|
|
assertEquals(0, c)
|
|
|
|
file.writeText(" ")
|
|
file.forEachLine { c++ }
|
|
assertEquals(1, c)
|
|
|
|
file.writeText(" \n")
|
|
c = 0
|
|
file.forEachLine { c++ }
|
|
assertEquals(1, c)
|
|
|
|
file.writeText(" \n ")
|
|
c = 0
|
|
file.forEachLine { c++ }
|
|
assertEquals(2, c)
|
|
|
|
file.deleteOnExit()
|
|
}
|
|
|
|
class LineIteratorTest {
|
|
test fun useLines() {
|
|
// TODO we should maybe zap the useLines approach as it encourages
|
|
// use of iterators which don't close the underlying stream
|
|
val list1 = sample().useLines { it.toArrayList() }
|
|
val list2 = sample().useLines<ArrayList<String>>{ it.toArrayList() }
|
|
|
|
assertEquals(arrayListOf("Hello", "World"), list1)
|
|
assertEquals(arrayListOf("Hello", "World"), list2)
|
|
}
|
|
|
|
test fun manualClose() {
|
|
val reader = sample().buffered()
|
|
try {
|
|
val list = reader.lineSequence().toArrayList()
|
|
assertEquals(arrayListOf("Hello", "World"), list)
|
|
} finally {
|
|
reader.close()
|
|
}
|
|
}
|
|
|
|
test fun boundaryConditions() {
|
|
var reader = StringReader("").buffered()
|
|
assertEquals(ArrayList<String>(), reader.lineSequence().toArrayList())
|
|
reader.close()
|
|
|
|
reader = StringReader(" ").buffered()
|
|
assertEquals(arrayListOf(" "), reader.lineSequence().toArrayList())
|
|
reader.close()
|
|
|
|
reader = StringReader(" \n").buffered()
|
|
assertEquals(arrayListOf(" "), reader.lineSequence().toArrayList())
|
|
reader.close()
|
|
|
|
reader = StringReader(" \n ").buffered()
|
|
assertEquals(arrayListOf(" ", " "), reader.lineSequence().toArrayList())
|
|
reader.close()
|
|
}
|
|
}
|
|
|
|
test fun testUse() {
|
|
val list = ArrayList<String>()
|
|
val reader = sample().buffered()
|
|
|
|
reader.use {
|
|
while (true) {
|
|
val line = it.readLine()
|
|
if (line != null)
|
|
list.add(line)
|
|
else
|
|
break
|
|
}
|
|
}
|
|
|
|
assertEquals(arrayListOf("Hello", "World"), list)
|
|
}
|
|
|
|
test fun testURL() {
|
|
val url = URL("http://kotlinlang.org")
|
|
val text = url.readText()
|
|
assertFalse(text.isEmpty())
|
|
val text2 = url.readText("UTF8")
|
|
assertFalse(text2.isEmpty())
|
|
}
|
|
}
|