increment(item: Int) (answer: Int) { answer = item + 1 } add(item: Int, state: Int) (next: Int) { next = state + item } stopAdd(item: Int, state: Int) (next: Int, stop: Bool) { next = state + item stop = item == 128 } total(bytes: Bytes) (answer: Int) { answer = reduce(add, bytes, 0) } incremented(bytes: Bytes) (answer: List) { answer = each(increment, bytes) } encode(text: Text) (answer: Bytes) { answer = dever.bytes.fromText(text) } decode(bytes: Bytes) (answer: Text) { answer = dever.bytes.toText(bytes) } convert(values: List) (answer: Bytes) { answer = dever.bytes.fromInts(values) } middle(bytes: Bytes) (answer: Bytes) { answer = dever.bytes.slice(bytes, 1, length(bytes) - 1) } join(bytes: Bytes) (answer: Bytes) { answer = dever.bytes.concat(bytes, bytes) } copyBytes(bytes: Bytes) (answer: Bytes) { answer = dever.bytes.slice(bytes, 0, length(bytes)) } identity(bytes: Bytes) (answer: Bytes) { answer = bytes } roundtrip(text: Text) (answer: Text) { answer = dever.bytes.toText(dever.bytes.fromText(text)) } bufferFailed(result: dever.bytes.BufferResult.Ready(bytes)) (answer: Bool) recover("verify expected conversion failures") { answer = false } bufferFailed(result: dever.bytes.BufferResult.Failed(message)) (answer: Bool) recover("verify expected conversion failures") { answer = message == "byte value must be between 0 and 255" or message == "invalid byte slice range" } decodeFailed(result: dever.bytes.DecodeResult.Decoded(text)) (answer: Bool) recover("verify expected conversion failures") { answer = false } decodeFailed(result: dever.bytes.DecodeResult.Failed(message)) (answer: Bool) recover("verify expected conversion failures") { answer = message == "invalid UTF-8" } lengthOrZero(bytes: Bytes) (answer: Int) { answer = length(bytes) } lengthOrZero(bytes: null) (answer: Int) { answer = -1 } verify() (answer: Bool) { bytes = convert([0, 127, 128, 255]) answer = length(bytes) == 4 and dever.bytes.length(bytes) == 4 answer = answer and dever.bytes.at(bytes, 0) == 0 and dever.bytes.at(bytes, 3) == 255 answer = answer and dever.bytes.at(bytes, -1) == null and dever.bytes.at(bytes, 4) == null answer = answer and dever.bytes.at(bytes, 9223372036854775807) == null answer = answer and total(bytes) == 510 and incremented(bytes) == [1, 128, 129, 256] answer = answer and reduceUntil(stopAdd, bytes, 1) == 256 answer = answer and total(convert([])) == 0 and length(incremented(convert([]))) == 0 answer = answer and reduce(add, bytes, -510) == 0 answer = answer and reduce(add, bytes, 9223372036854775297) == 9223372036854775807 answer = answer and reduce(add, convert([]), 9223372036854775807) == 9223372036854775807 answer = answer and lengthOrZero(convert([])) == 0 and lengthOrZero(null) == -1 answer = answer and middle(bytes) == convert([127, 128]) answer = answer and dever.bytes.slice(bytes, 4, 4) == convert([]) answer = answer and bufferFailed(result(convert([-1]))) and bufferFailed(result(convert([256]))) answer = answer and bufferFailed(result(dever.bytes.slice(bytes, 2, 1))) answer = answer and bufferFailed(result(dever.bytes.slice(bytes, -1, 0))) answer = answer and bufferFailed(result(dever.bytes.slice(bytes, 0, 5))) answer = answer and decodeFailed(result(decode(convert([255])))) answer = answer and decodeFailed(result(decode(convert([192, 128])))) answer = answer and decodeFailed(result(decode(convert([237, 160, 128])))) answer = answer and decodeFailed(result(decode(convert([226, 130])))) text = "雪🙂" answer = answer and length(encode(text)) == 7 and roundtrip(text) == text answer = answer and roundtrip("") == "" texts = ["雪🙂", "", "a"] encoded = each(dever.bytes.fromText, texts) answer = answer and texts == ["雪🙂", "", "a"] answer = answer and each(dever.bytes.toText, encoded) == texts answer = answer and each(dever.bytes.toText, each(dever.bytes.fromText, ["雪🙂", "", "a"])) == texts answer = answer and length(each(dever.bytes.fromText, [])) == 0 answer = answer and each(dever.bytes.toText, each(dever.bytes.fromText, text.split("雪,\u{0},🙂", ","))) == ["雪", "\u{0}", "🙂"] answer = answer and each(dever.bytes.toText, each(dever.bytes.fromText, text.split("雪🙂", ""))) == ["雪", "🙂"] answer = answer and each(dever.bytes.toText, each(dever.bytes.fromText, text.split(",x,", ","))) == ["", "x", ""] answer = answer and length(each(dever.bytes.fromText, text.split("", ""))) == 0 answer = answer and each(dever.bytes.toText, [convert([0]), convert([97])]) == ["\u{0}", "a"] answer = answer and encode(decode(convert([97, 0, 98]))) == convert([97, 0, 98]) combined = join(bytes) answer = answer and combined == convert([0, 127, 128, 255, 0, 127, 128, 255]) answer = answer and bytes == convert([0, 127, 128, 255]) prefix = "雪\u{0}🙂" saved_prefix = prefix expected_prefix = convert([233, 155, 170, 0, 240, 159, 153, 130]) prefixed_bytes = prefixed(bytes) answer = answer and prefixed_bytes == dever.bytes.concat(expected_prefix, bytes) answer = answer and prefixed(convert([])) == expected_prefix answer = answer and dever.bytes.concat(dever.bytes.fromText(""), bytes) == bytes answer = answer and dever.bytes.concat(dever.bytes.fromText(prefix), bytes) == prefixed_bytes answer = answer and prefix == saved_prefix and bytes == convert([0, 127, 128, 255]) seed = convert([1, 2]) saved = seed joined = reduce(joinPart, [convert([0, 255]), convert([]), convert([3])], seed) answer = answer and joined == convert([1, 2, 0, 255, 3]) and saved == convert([1, 2]) answer = answer and reduce(joinPart, [], bytes) == bytes answer = answer and reduce(joinPart, [bytes, bytes], convert([])) == combined answer = answer and reduce(joinPart, stream([convert([1]), convert([]), convert([255])]), convert([])) == convert([1, 255]) answer = answer and dever.bytes.toText(reduce(joinPart, [encode("a"), encode("雪")], encode("开始"))) == "开始a雪" answer = answer and reduce(joinPart, [], encode("")) == convert([]) answer = answer and joinedText("雪\u{0}🙂", seed) == dever.bytes.concat(seed, expected_prefix) answer = answer and joinedText("", seed) == seed and seed == saved answer = answer and joinedReplaced("雪🙂", seed) == dever.bytes.concat(dever.bytes.concat(seed, encode("雪🙂")), seed) } joinPart(item: Bytes, state: Bytes) (answer: Bytes) { answer = dever.bytes.concat(state, item) } prefixed(bytes: Bytes) (answer: Bytes) { answer = dever.bytes.concat(dever.bytes.fromText("雪\u{0}🙂"), bytes) } suffixOnce() (bytes: Bytes) { dever.io.println("suffix") bytes = convert([0, 255]) } concatOrderEntry() (answer: Bool) { bytes = dever.bytes.concat(dever.bytes.fromText("雪\u{0}🙂"), suffixOnce()) answer = bytes == convert([233, 155, 170, 0, 240, 159, 153, 130, 0, 255]) } concatArgumentEntry() (answer: Bytes) { answer = dever.bytes.concat(dever.bytes.fromText("雪\u{0}"), convert([256])) } concatLeftErrorEntry() (answer: Bytes) { answer = dever.bytes.concat(dever.bytes.fromText(decode(convert([255]))), convert([256])) } invalidEntry() (answer: Text) { answer = decode(convert([255])) } invalidListEntry() (answer: List) { answer = each(dever.bytes.toText, [convert([97]), convert([255])]) } overflowEntry() (answer: Int) { answer = reduce(add, convert([1]), 9223372036854775807) } argumentEntry() (answer: dever.bytes.DecodeResult) { answer = result(decode(convert([256]))) } joinedText(text: Text, seed: Bytes) (answer: Bytes) { parts = each(dever.bytes.fromText, text.split(text, "")) answer = reduce(joinPart, parts, seed) } joinedReplaced(text: Text, seed: Bytes) (answer: Bytes) { parts = each(dever.bytes.fromText, text.split(text, "")) first = reduce(joinPart, parts, seed) parts = [seed] answer = reduce(joinPart, parts, first) } joinedSeedErrorEntry() (answer: Bytes) { answer = joinedSeedError("雪🙂") } joinedSeedError(text: Text) (answer: Bytes) { parts = each(dever.bytes.fromText, text.split(text, "")) answer = reduce(joinPart, parts, convert([256])) }