aboutsummaryrefslogtreecommitdiff
path: root/okio/src/commonTest/kotlin/okio/ByteStringTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'okio/src/commonTest/kotlin/okio/ByteStringTest.kt')
-rw-r--r--okio/src/commonTest/kotlin/okio/ByteStringTest.kt499
1 files changed, 499 insertions, 0 deletions
diff --git a/okio/src/commonTest/kotlin/okio/ByteStringTest.kt b/okio/src/commonTest/kotlin/okio/ByteStringTest.kt
new file mode 100644
index 00000000..c75c4581
--- /dev/null
+++ b/okio/src/commonTest/kotlin/okio/ByteStringTest.kt
@@ -0,0 +1,499 @@
+/*
+ * Copyright (C) 2018 Square, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package okio
+
+import okio.ByteString.Companion.decodeBase64
+import okio.ByteString.Companion.decodeHex
+import okio.ByteString.Companion.encodeUtf8
+import okio.internal.commonAsUtf8ToByteArray
+import kotlin.random.Random
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertFailsWith
+import kotlin.test.assertFalse
+import kotlin.test.assertNotEquals
+import kotlin.test.assertSame
+import kotlin.test.assertTrue
+import kotlin.test.fail
+
+class ByteStringTest : AbstractByteStringTest(ByteStringFactory.BYTE_STRING)
+class SegmentedByteStringTest : AbstractByteStringTest(ByteStringFactory.SEGMENTED_BYTE_STRING)
+class ByteStringOneBytePerSegmentTest : AbstractByteStringTest(ByteStringFactory.ONE_BYTE_PER_SEGMENT)
+class OkioEncoderTest : AbstractByteStringTest(ByteStringFactory.OKIO_ENCODER)
+
+abstract class AbstractByteStringTest internal constructor(
+ private val factory: ByteStringFactory
+) {
+ @Test fun get() {
+ val actual = factory.encodeUtf8("abc")
+ assertEquals(3, actual.size)
+ assertEquals(actual[0], 'a'.toByte())
+ assertEquals(actual[1], 'b'.toByte())
+ assertEquals(actual[2], 'c'.toByte())
+ try {
+ actual[-1]
+ fail("no index out of bounds: -1")
+ } catch (expected: IndexOutOfBoundsException) {
+ }
+ try {
+ actual[3]
+ fail("no index out of bounds: 3")
+ } catch (expected: IndexOutOfBoundsException) {
+ }
+ }
+
+ @Test fun getByte() {
+ val byteString = factory.decodeHex("ab12")
+ assertEquals(-85, byteString[0].toLong())
+ assertEquals(18, byteString[1].toLong())
+ }
+
+ @Test fun startsWithByteString() {
+ val byteString = factory.decodeHex("112233")
+ assertTrue(byteString.startsWith("".decodeHex()))
+ assertTrue(byteString.startsWith("11".decodeHex()))
+ assertTrue(byteString.startsWith("1122".decodeHex()))
+ assertTrue(byteString.startsWith("112233".decodeHex()))
+ assertFalse(byteString.startsWith("2233".decodeHex()))
+ assertFalse(byteString.startsWith("11223344".decodeHex()))
+ assertFalse(byteString.startsWith("112244".decodeHex()))
+ }
+
+ @Test fun endsWithByteString() {
+ val byteString = factory.decodeHex("112233")
+ assertTrue(byteString.endsWith("".decodeHex()))
+ assertTrue(byteString.endsWith("33".decodeHex()))
+ assertTrue(byteString.endsWith("2233".decodeHex()))
+ assertTrue(byteString.endsWith("112233".decodeHex()))
+ assertFalse(byteString.endsWith("1122".decodeHex()))
+ assertFalse(byteString.endsWith("00112233".decodeHex()))
+ assertFalse(byteString.endsWith("002233".decodeHex()))
+ }
+
+ @Test fun startsWithByteArray() {
+ val byteString = factory.decodeHex("112233")
+ assertTrue(byteString.startsWith("".decodeHex().toByteArray()))
+ assertTrue(byteString.startsWith("11".decodeHex().toByteArray()))
+ assertTrue(byteString.startsWith("1122".decodeHex().toByteArray()))
+ assertTrue(byteString.startsWith("112233".decodeHex().toByteArray()))
+ assertFalse(byteString.startsWith("2233".decodeHex().toByteArray()))
+ assertFalse(byteString.startsWith("11223344".decodeHex().toByteArray()))
+ assertFalse(byteString.startsWith("112244".decodeHex().toByteArray()))
+ }
+
+ @Test fun endsWithByteArray() {
+ val byteString = factory.decodeHex("112233")
+ assertTrue(byteString.endsWith("".decodeHex().toByteArray()))
+ assertTrue(byteString.endsWith("33".decodeHex().toByteArray()))
+ assertTrue(byteString.endsWith("2233".decodeHex().toByteArray()))
+ assertTrue(byteString.endsWith("112233".decodeHex().toByteArray()))
+ assertFalse(byteString.endsWith("1122".decodeHex().toByteArray()))
+ assertFalse(byteString.endsWith("00112233".decodeHex().toByteArray()))
+ assertFalse(byteString.endsWith("002233".decodeHex().toByteArray()))
+ }
+
+ @Test fun indexOfByteString() {
+ val byteString = factory.decodeHex("112233")
+ assertEquals(0, byteString.indexOf("112233".decodeHex()).toLong())
+ assertEquals(0, byteString.indexOf("1122".decodeHex()).toLong())
+ assertEquals(0, byteString.indexOf("11".decodeHex()).toLong())
+ assertEquals(0, byteString.indexOf("11".decodeHex(), 0).toLong())
+ assertEquals(0, byteString.indexOf("".decodeHex()).toLong())
+ assertEquals(0, byteString.indexOf("".decodeHex(), 0).toLong())
+ assertEquals(1, byteString.indexOf("2233".decodeHex()).toLong())
+ assertEquals(1, byteString.indexOf("22".decodeHex()).toLong())
+ assertEquals(1, byteString.indexOf("22".decodeHex(), 1).toLong())
+ assertEquals(1, byteString.indexOf("".decodeHex(), 1).toLong())
+ assertEquals(2, byteString.indexOf("33".decodeHex()).toLong())
+ assertEquals(2, byteString.indexOf("33".decodeHex(), 2).toLong())
+ assertEquals(2, byteString.indexOf("".decodeHex(), 2).toLong())
+ assertEquals(3, byteString.indexOf("".decodeHex(), 3).toLong())
+ assertEquals(-1, byteString.indexOf("112233".decodeHex(), 1).toLong())
+ assertEquals(-1, byteString.indexOf("44".decodeHex()).toLong())
+ assertEquals(-1, byteString.indexOf("11223344".decodeHex()).toLong())
+ assertEquals(-1, byteString.indexOf("112244".decodeHex()).toLong())
+ assertEquals(-1, byteString.indexOf("112233".decodeHex(), 1).toLong())
+ assertEquals(-1, byteString.indexOf("2233".decodeHex(), 2).toLong())
+ assertEquals(-1, byteString.indexOf("33".decodeHex(), 3).toLong())
+ assertEquals(-1, byteString.indexOf("".decodeHex(), 4).toLong())
+ }
+
+ @Test fun indexOfWithOffset() {
+ val byteString = factory.decodeHex("112233112233")
+ assertEquals(0, byteString.indexOf("112233".decodeHex(), -1).toLong())
+ assertEquals(0, byteString.indexOf("112233".decodeHex(), 0).toLong())
+ assertEquals(0, byteString.indexOf("112233".decodeHex()).toLong())
+ assertEquals(3, byteString.indexOf("112233".decodeHex(), 1).toLong())
+ assertEquals(3, byteString.indexOf("112233".decodeHex(), 2).toLong())
+ assertEquals(3, byteString.indexOf("112233".decodeHex(), 3).toLong())
+ assertEquals(-1, byteString.indexOf("112233".decodeHex(), 4).toLong())
+ }
+
+ @Test fun indexOfByteArray() {
+ val byteString = factory.decodeHex("112233")
+ assertEquals(0, byteString.indexOf("112233".decodeHex().toByteArray()).toLong())
+ assertEquals(1, byteString.indexOf("2233".decodeHex().toByteArray()).toLong())
+ assertEquals(2, byteString.indexOf("33".decodeHex().toByteArray()).toLong())
+ assertEquals(-1, byteString.indexOf("112244".decodeHex().toByteArray()).toLong())
+ }
+
+ @Test fun lastIndexOfByteString() {
+ val byteString = factory.decodeHex("112233")
+ assertEquals(0, byteString.lastIndexOf("112233".decodeHex()).toLong())
+ assertEquals(0, byteString.lastIndexOf("1122".decodeHex()).toLong())
+ assertEquals(0, byteString.lastIndexOf("11".decodeHex()).toLong())
+ assertEquals(0, byteString.lastIndexOf("11".decodeHex(), 3).toLong())
+ assertEquals(0, byteString.lastIndexOf("11".decodeHex(), 0).toLong())
+ assertEquals(0, byteString.lastIndexOf("".decodeHex(), 0).toLong())
+ assertEquals(1, byteString.lastIndexOf("2233".decodeHex()).toLong())
+ assertEquals(1, byteString.lastIndexOf("22".decodeHex()).toLong())
+ assertEquals(1, byteString.lastIndexOf("22".decodeHex(), 3).toLong())
+ assertEquals(1, byteString.lastIndexOf("22".decodeHex(), 1).toLong())
+ assertEquals(1, byteString.lastIndexOf("".decodeHex(), 1).toLong())
+ assertEquals(2, byteString.lastIndexOf("33".decodeHex()).toLong())
+ assertEquals(2, byteString.lastIndexOf("33".decodeHex(), 3).toLong())
+ assertEquals(2, byteString.lastIndexOf("33".decodeHex(), 2).toLong())
+ assertEquals(2, byteString.lastIndexOf("".decodeHex(), 2).toLong())
+ assertEquals(3, byteString.lastIndexOf("".decodeHex(), 3).toLong())
+ assertEquals(3, byteString.lastIndexOf("".decodeHex()).toLong())
+ assertEquals(-1, byteString.lastIndexOf("112233".decodeHex(), -1).toLong())
+ assertEquals(-1, byteString.lastIndexOf("112233".decodeHex(), -2).toLong())
+ assertEquals(-1, byteString.lastIndexOf("44".decodeHex()).toLong())
+ assertEquals(-1, byteString.lastIndexOf("11223344".decodeHex()).toLong())
+ assertEquals(-1, byteString.lastIndexOf("112244".decodeHex()).toLong())
+ assertEquals(-1, byteString.lastIndexOf("2233".decodeHex(), 0).toLong())
+ assertEquals(-1, byteString.lastIndexOf("33".decodeHex(), 1).toLong())
+ assertEquals(-1, byteString.lastIndexOf("".decodeHex(), -1).toLong())
+ }
+
+ @Test fun lastIndexOfByteArray() {
+ val byteString = factory.decodeHex("112233")
+ assertEquals(0, byteString.lastIndexOf("112233".decodeHex().toByteArray()).toLong())
+ assertEquals(1, byteString.lastIndexOf("2233".decodeHex().toByteArray()).toLong())
+ assertEquals(2, byteString.lastIndexOf("33".decodeHex().toByteArray()).toLong())
+ assertEquals(3, byteString.lastIndexOf("".decodeHex().toByteArray()).toLong())
+ }
+
+ @Test fun equalsTest() {
+ val byteString = factory.decodeHex("000102")
+ assertEquals(byteString, byteString)
+ assertEquals(byteString, "000102".decodeHex())
+ assertNotEquals(byteString, Any())
+ assertNotEquals(byteString, "000201".decodeHex())
+ }
+
+ @Test fun equalsEmptyTest() {
+ assertEquals(factory.decodeHex(""), ByteString.EMPTY)
+ assertEquals(factory.decodeHex(""), ByteString.of())
+ assertEquals(ByteString.EMPTY, factory.decodeHex(""))
+ assertEquals(ByteString.of(), factory.decodeHex(""))
+ }
+
+ private val bronzeHorseman = "На берегу пустынных волн"
+
+ @Test fun utf8() {
+ val byteString = factory.encodeUtf8(bronzeHorseman)
+ assertEquals(byteString.toByteArray().toList(), bronzeHorseman.commonAsUtf8ToByteArray().toList())
+ assertTrue(byteString == ByteString.of(*bronzeHorseman.commonAsUtf8ToByteArray()))
+ assertEquals(
+ byteString,
+ (
+ "d09dd0b020d0b1d0b5d180d0b5d0b3d18320d0bfd183d181" +
+ "d182d18bd0bdd0bdd18bd18520d0b2d0bed0bbd0bd"
+ ).decodeHex()
+ )
+ assertEquals(byteString.utf8(), bronzeHorseman)
+ }
+
+ @Test fun testHashCode() {
+ val byteString = factory.decodeHex("0102")
+ assertEquals(byteString.hashCode().toLong(), byteString.hashCode().toLong())
+ assertEquals(byteString.hashCode().toLong(), "0102".decodeHex().hashCode().toLong())
+ }
+
+ @Test fun toAsciiLowerCaseNoUppercase() {
+ val s = factory.encodeUtf8("a1_+")
+ assertEquals(s, s.toAsciiLowercase())
+ if (factory === ByteStringFactory.BYTE_STRING) {
+ assertSame(s, s.toAsciiLowercase())
+ }
+ }
+
+ @Test fun toAsciiAllUppercase() {
+ assertEquals("ab".encodeUtf8(), factory.encodeUtf8("AB").toAsciiLowercase())
+ }
+
+ @Test fun toAsciiStartsLowercaseEndsUppercase() {
+ assertEquals("abcd".encodeUtf8(), factory.encodeUtf8("abCD").toAsciiLowercase())
+ }
+
+ @Test fun toAsciiStartsUppercaseEndsLowercase() {
+ assertEquals("ABCD".encodeUtf8(), factory.encodeUtf8("ABcd").toAsciiUppercase())
+ }
+
+ @Test fun substring() {
+ val byteString = factory.encodeUtf8("Hello, World!")
+
+ assertEquals(byteString.substring(0), byteString)
+ assertEquals(byteString.substring(0, 5), "Hello".encodeUtf8())
+ assertEquals(byteString.substring(7), "World!".encodeUtf8())
+ assertEquals(byteString.substring(6, 6), "".encodeUtf8())
+ }
+
+ @Test fun substringWithInvalidBounds() {
+ val byteString = factory.encodeUtf8("Hello, World!")
+
+ assertFailsWith<IllegalArgumentException> {
+ byteString.substring(-1)
+ }
+
+ assertFailsWith<IllegalArgumentException> {
+ byteString.substring(0, 14)
+ }
+
+ assertFailsWith<IllegalArgumentException> {
+ byteString.substring(8, 7)
+ }
+ }
+
+ @Test fun encodeBase64() {
+ assertEquals("", factory.encodeUtf8("").base64())
+ assertEquals("AA==", factory.encodeUtf8("\u0000").base64())
+ assertEquals("AAA=", factory.encodeUtf8("\u0000\u0000").base64())
+ assertEquals("AAAA", factory.encodeUtf8("\u0000\u0000\u0000").base64())
+ assertEquals(
+ "SG93IG1hbnkgbGluZXMgb2YgY29kZSBhcmUgdGhlcmU/ICdib3V0IDIgbWlsbGlvbi4=",
+ factory.encodeUtf8("How many lines of code are there? 'bout 2 million.").base64()
+ )
+ }
+
+ @Test fun encodeBase64Url() {
+ assertEquals("", factory.encodeUtf8("").base64Url())
+ assertEquals("AA==", factory.encodeUtf8("\u0000").base64Url())
+ assertEquals("AAA=", factory.encodeUtf8("\u0000\u0000").base64Url())
+ assertEquals("AAAA", factory.encodeUtf8("\u0000\u0000\u0000").base64Url())
+ assertEquals(
+ "SG93IG1hbnkgbGluZXMgb2YgY29kZSBhcmUgdGhlcmU_ICdib3V0IDIgbWlsbGlvbi4=",
+ factory.encodeUtf8("How many lines of code are there? 'bout 2 million.").base64Url()
+ )
+ }
+
+ @Test fun ignoreUnnecessaryPadding() {
+ assertEquals("", "====".decodeBase64()!!.utf8())
+ assertEquals("\u0000\u0000\u0000", "AAAA====".decodeBase64()!!.utf8())
+ }
+
+ @Test fun decodeBase64() {
+ assertEquals("", "".decodeBase64()!!.utf8())
+ assertEquals(null, "/===".decodeBase64()) // Can't do anything with 6 bits!
+ assertEquals("ff".decodeHex(), "//==".decodeBase64())
+ assertEquals("ff".decodeHex(), "__==".decodeBase64())
+ assertEquals("ffff".decodeHex(), "///=".decodeBase64())
+ assertEquals("ffff".decodeHex(), "___=".decodeBase64())
+ assertEquals("ffffff".decodeHex(), "////".decodeBase64())
+ assertEquals("ffffff".decodeHex(), "____".decodeBase64())
+ assertEquals("ffffffffffff".decodeHex(), "////////".decodeBase64())
+ assertEquals("ffffffffffff".decodeHex(), "________".decodeBase64())
+ assertEquals(
+ "What's to be scared about? It's just a little hiccup in the power...",
+ (
+ "V2hhdCdzIHRvIGJlIHNjYXJlZCBhYm91dD8gSXQncyBqdXN0IGEgbGl0dGxlIGhpY2" +
+ "N1cCBpbiB0aGUgcG93ZXIuLi4="
+ ).decodeBase64()!!.utf8()
+ )
+ // Uses two encoding styles. Malformed, but supported as a side-effect.
+ assertEquals("ffffff".decodeHex(), "__//".decodeBase64())
+ }
+
+ @Test fun decodeBase64WithWhitespace() {
+ assertEquals("\u0000\u0000\u0000", " AA AA ".decodeBase64()!!.utf8())
+ assertEquals("\u0000\u0000\u0000", " AA A\r\nA ".decodeBase64()!!.utf8())
+ assertEquals("\u0000\u0000\u0000", "AA AA".decodeBase64()!!.utf8())
+ assertEquals("\u0000\u0000\u0000", " AA AA ".decodeBase64()!!.utf8())
+ assertEquals("\u0000\u0000\u0000", " AA A\r\nA ".decodeBase64()!!.utf8())
+ assertEquals("\u0000\u0000\u0000", "A AAA".decodeBase64()!!.utf8())
+ assertEquals("", " ".decodeBase64()!!.utf8())
+ }
+
+ @Test fun encodeHex() {
+ assertEquals("000102", ByteString.of(0x0, 0x1, 0x2).hex())
+ }
+
+ @Test fun decodeHex() {
+ val actual = "CAFEBABE".decodeHex()
+ val expected = ByteString.of(-54, -2, -70, -66)
+ assertEquals(expected, actual)
+ }
+
+ @Test fun decodeHexOddNumberOfChars() {
+ assertFailsWith<IllegalArgumentException> {
+ "aaa".decodeHex()
+ }
+ }
+
+ @Test fun decodeHexInvalidChar() {
+ assertFailsWith<IllegalArgumentException> {
+ "a\u0000".decodeHex()
+ }
+ }
+
+ @Test fun toStringOnEmpty() {
+ assertEquals("[size=0]", factory.decodeHex("").toString())
+ }
+
+ @Test fun toStringOnShortText() {
+ assertEquals(
+ "[text=Tyrannosaur]",
+ factory.encodeUtf8("Tyrannosaur").toString()
+ )
+ assertEquals(
+ "[text=təˈranəˌsôr]",
+ factory.decodeHex("74c999cb8872616ec999cb8c73c3b472").toString()
+ )
+ }
+
+ @Test fun toStringOnLongTextIsTruncated() {
+ val raw = (
+ "Um, I'll tell you the problem with the scientific power that you're using here, " +
+ "it didn't require any discipline to attain it. You read what others had done and you " +
+ "took the next step. You didn't earn the knowledge for yourselves, so you don't take any " +
+ "responsibility for it. You stood on the shoulders of geniuses to accomplish something " +
+ "as fast as you could, and before you even knew what you had, you patented it, and " +
+ "packaged it, and slapped it on a plastic lunchbox, and now you're selling it, you wanna " +
+ "sell it."
+ )
+ assertEquals(
+ "[size=517 text=Um, I'll tell you the problem with the scientific power that " +
+ "you…]",
+ factory.encodeUtf8(raw).toString()
+ )
+ val war = (
+ "Սm, I'll 𝓽𝖾ll ᶌօ𝘂 ᴛℎ℮ 𝜚𝕣०bl𝖾m wі𝕥𝒽 𝘵𝘩𝐞 𝓼𝙘𝐢𝔢𝓷𝗍𝜄𝚏𝑖c 𝛠𝝾w𝚎𝑟 𝕥h⍺𝞃 𝛄𝓸𝘂'𝒓𝗲 υ𝖘𝓲𝗇ɡ 𝕙𝚎𝑟e, " +
+ "𝛊𝓽 ⅆ𝕚𝐝𝝿'𝗍 𝔯𝙚𝙦ᴜ𝜾𝒓𝘦 𝔞𝘯𝐲 ԁ𝜄𝑠𝚌ι𝘱lι𝒏e 𝑡𝜎 𝕒𝚝𝖙𝓪і𝞹 𝔦𝚝. 𝒀ο𝗎 𝔯𝑒⍺𝖉 w𝐡𝝰𝔱 𝞂𝞽һ𝓮𝓇ƽ հ𝖺𝖉 ⅾ𝛐𝝅ⅇ 𝝰πԁ 𝔂ᴑᴜ 𝓉ﮨ၀𝚔 " +
+ "т𝒽𝑒 𝗇𝕖ⅹ𝚝 𝔰𝒕е𝓅. 𝘠ⲟ𝖚 𝖉ⅰԁ𝝕'τ 𝙚𝚊r𝞹 𝘵Ꮒ𝖾 𝝒𝐧هwl𝑒𝖉ƍ𝙚 𝓯૦r 𝔂𝞼𝒖𝕣𝑠𝕖l𝙫𝖊𝓼, 𐑈о y𝘰𝒖 ⅆە𝗇't 𝜏α𝒌𝕖 𝛂𝟉ℽ " +
+ "𝐫ⅇ𝗌ⲣ๐ϖ𝖘ꙇᖯ𝓲l𝓲𝒕𝘆 𝐟𝞼𝘳 𝚤𝑡. 𝛶𝛔𝔲 s𝕥σσ𝐝 ﮩ𝕟 𝒕𝗁𝔢 𝘴𝐡𝜎ᴜlⅾ𝓮𝔯𝚜 𝛐𝙛 ᶃ𝚎ᴨᎥս𝚜𝘦𝓈 𝓽𝞸 a𝒄𝚌𝞸mρl𝛊ꜱ𝐡 𝓈𝚘m𝚎𝞃𝔥⍳𝞹𝔤 𝐚𝗌 𝖋a𝐬𝒕 " +
+ "αs γ𝛐𝕦 𝔠ﻫ𝛖lԁ, 𝚊π𝑑 Ь𝑒𝙛૦𝓇𝘦 𝓎٥𝖚 ⅇvℯ𝝅 𝜅ո𝒆w w𝗵𝒂𝘁 ᶌ੦𝗎 h𝐚𝗱, 𝜸ﮨ𝒖 𝓹𝝰𝔱𝖾𝗇𝓽𝔢ⅆ і𝕥, 𝚊𝜛𝓭 𝓹𝖺ⅽϰ𝘢ℊеᏧ 𝑖𝞃, " +
+ "𝐚𝛑ꓒ 𝙨l𝔞р𝘱𝔢𝓭 ɩ𝗍 ہ𝛑 𝕒 pl𝛂ѕᴛ𝗂𝐜 l𝞄ℼ𝔠𝒽𝑏ﮪ⨯, 𝔞ϖ𝒹 n𝛔w 𝛾𝐨𝞄'𝗿𝔢 ꜱ℮ll𝙞nɡ ɩ𝘁, 𝙮𝕠𝛖 w𝑎ℼ𝚗𝛂 𝕤𝓮ll 𝙞𝓉."
+ )
+ assertEquals(
+ "[size=1496 text=Սm, I'll 𝓽𝖾ll ᶌօ𝘂 ᴛℎ℮ 𝜚𝕣०bl𝖾m wі𝕥𝒽 𝘵𝘩𝐞 𝓼𝙘𝐢𝔢𝓷𝗍𝜄𝚏𝑖c 𝛠𝝾w𝚎𝑟 𝕥h⍺𝞃 " +
+ "𝛄𝓸𝘂…]",
+ factory.encodeUtf8(war).toString()
+ )
+ }
+
+ @Test fun toStringOnTextWithNewlines() {
+ // Instead of emitting a literal newline in the toString(), these are escaped as "\n".
+ assertEquals(
+ "[text=a\\r\\nb\\nc\\rd\\\\e]",
+ factory.encodeUtf8("a\r\nb\nc\rd\\e").toString()
+ )
+ }
+
+ @Test fun toStringOnData() {
+ val byteString = factory.decodeHex(
+ "" +
+ "60b420bb3851d9d47acb933dbe70399bf6c92da33af01d4fb770e98c0325f41d3ebaf8986da712c82bcd4d55" +
+ "4bf0b54023c29b624de9ef9c2f931efc580f9afb"
+ )
+ assertEquals(
+ "[hex=" +
+ "60b420bb3851d9d47acb933dbe70399bf6c92da33af01d4fb770e98c0325f41d3ebaf8986da712c82bcd4d55" +
+ "4bf0b54023c29b624de9ef9c2f931efc580f9afb]",
+ byteString.toString()
+ )
+ }
+
+ @Test fun toStringOnLongDataIsTruncated() {
+ val byteString = factory.decodeHex(
+ "" +
+ "60b420bb3851d9d47acb933dbe70399bf6c92da33af01d4fb770e98c0325f41d3ebaf8986da712c82bcd4d55" +
+ "4bf0b54023c29b624de9ef9c2f931efc580f9afba1"
+ )
+ assertEquals(
+ "[size=65 hex=" +
+ "60b420bb3851d9d47acb933dbe70399bf6c92da33af01d4fb770e98c0325f41d3ebaf8986da712c82bcd4d55" +
+ "4bf0b54023c29b624de9ef9c2f931efc580f9afb…]",
+ byteString.toString()
+ )
+ }
+
+ @Test fun compareToSingleBytes() {
+ val originalByteStrings = listOf(
+ factory.decodeHex("00"),
+ factory.decodeHex("01"),
+ factory.decodeHex("7e"),
+ factory.decodeHex("7f"),
+ factory.decodeHex("80"),
+ factory.decodeHex("81"),
+ factory.decodeHex("fe"),
+ factory.decodeHex("ff")
+ )
+
+ val sortedByteStrings = originalByteStrings.toMutableList()
+ sortedByteStrings.shuffle(Random(0))
+ assertNotEquals(originalByteStrings, sortedByteStrings)
+
+ sortedByteStrings.sort()
+ assertEquals(originalByteStrings, sortedByteStrings)
+ }
+
+ @Test fun compareToMultipleBytes() {
+ val originalByteStrings = listOf(
+ factory.decodeHex(""),
+ factory.decodeHex("00"),
+ factory.decodeHex("0000"),
+ factory.decodeHex("000000"),
+ factory.decodeHex("00000000"),
+ factory.decodeHex("0000000000"),
+ factory.decodeHex("0000000001"),
+ factory.decodeHex("000001"),
+ factory.decodeHex("00007f"),
+ factory.decodeHex("0000ff"),
+ factory.decodeHex("000100"),
+ factory.decodeHex("000101"),
+ factory.decodeHex("007f00"),
+ factory.decodeHex("00ff00"),
+ factory.decodeHex("010000"),
+ factory.decodeHex("010001"),
+ factory.decodeHex("01007f"),
+ factory.decodeHex("0100ff"),
+ factory.decodeHex("010100"),
+ factory.decodeHex("01010000"),
+ factory.decodeHex("0101000000"),
+ factory.decodeHex("0101000001"),
+ factory.decodeHex("010101"),
+ factory.decodeHex("7f0000"),
+ factory.decodeHex("7f0000ffff"),
+ factory.decodeHex("ffffff")
+ )
+
+ val sortedByteStrings = originalByteStrings.toMutableList()
+ sortedByteStrings.shuffle(Random(0))
+ assertNotEquals(originalByteStrings, sortedByteStrings)
+
+ sortedByteStrings.sort()
+ assertEquals(originalByteStrings, sortedByteStrings)
+ }
+
+ @Test fun testHash() = with(factory.encodeUtf8("Kevin")) {
+ assertEquals("e043899daa0c7add37bc99792b2c045d6abbc6dc", sha1().hex())
+ assertEquals("f1cd318e412b5f7226e5f377a9544ff7", md5().hex())
+ assertEquals("0e4dd66217fc8d2e298b78c8cd9392870dcd065d0ff675d0edff5bcd227837e9", sha256().hex())
+ assertEquals("483676b93c4417198b465083d196ec6a9fab8d004515874b8ff47e041f5f56303cc08179625030b8b5b721c09149a18f0f59e64e7ae099518cea78d3d83167e1", sha512().hex())
+ }
+}