type Failure { error Missing } readNumber(value: Json?) (number: Int) { number = selectNumber(value) } selectNumber(value: null) (number: Int) { fail(Failure.Missing) } selectNumber(value: Json) (number: Int) { number = dever.json.asInteger(value) } verify() (answer: Bool) { value = dever.json.fromText("{\"count\":42,\"ratio\":1e+03,\"name\":\"dever\"}") encoded = dever.json.encode(value) snapshot = dever.json.toText(value) count = readNumber(dever.json.propertyValue(value, "count")) answer = count == 42 and snapshot == dever.json.toText(encoded) and snapshot == "{\"count\":42,\"ratio\":1e+03,\"name\":\"dever\"}" raw = dever.json.fromText(" 1e9999 ") answer = answer and dever.json.toText(dever.json.encode(raw)) == " 1e9999 " } documentVerify() (answer: Bool) { document = dever.json.parse("{\"count\":42,\"name\":\"dever\"}") count = dever.json.property(document, document.root, "count") values = dever.json.parse("[1,2]") first = dever.json.element(values, values.root, 0) empty = dever.json.parse("{}") nested = dever.json.parse("{\"\":[{},[]]}") answer = count == 0 and first == 0 and dever.json.stringify(document) == "{\"count\":42,\"name\":\"dever\"}" and dever.json.stringify(empty) == "{}" and dever.json.property(empty, empty.root, "missing") == null and dever.json.stringify(nested) == "{\"\":[{},[]]}" } invalid() (answer: Int) { value = dever.json.fromText("{") answer = 1 } type Payload { amount: Decimal id: Id names: List optional: Int? } encodeVerify() (answer: Bool) { payload = Payload { amount = 12.5, id = dever.id.fromText("item"), names = ["雪"], optional = null } encoded = dever.json.toText(dever.json.encode(payload)) answer = encoded == "{\"amount\":\"12.5\",\"id\":\"item\",\"names\":[\"雪\"],\"optional\":null}" answer = answer and dever.json.toText(dever.json.encode([true, false])) == "[true,false]" answer = answer and dever.json.toText(dever.json.encode(payload.optional)) == "null" answer = answer and dever.json.toText(dever.json.encode(42)) == "42" answer = answer and dever.json.toText(dever.json.encode(true)) == "true" answer = answer and dever.json.toText(dever.json.encode("雪\n\"")) == "\"雪\\n\\\"\"" answer = answer and dever.json.toText(dever.json.encode(float.parse("-0.0"))) == "-0.0" object = dever.json.object({"a" = dever.json.integer(1), "b" = dever.json.array([dever.json.boolean(true), dever.json.string("雪"), dever.json.nullValue()])}) answer = answer and dever.json.toText(object) == "{\"a\":1,\"b\":[true,\"雪\",null]}" } manualVerify() (answer: Bool) { document = dever.json.value.Document { root = 2 nodes = [ dever.json.value.Value.Null, dever.json.value.Value.Number("1e9999"), dever.json.value.Value.Object({"answer" = 1}) ] } answer = dever.json.stringify(document) == "{\"answer\":1e9999}" answer = answer and dever.json.node(document, 1) == dever.json.value.Value.Number("1e9999") answer = answer and dever.json.node(document, 0) == dever.json.value.Value.Null answer = answer and dever.json.node(document, 2) == dever.json.value.Value.Object({"answer" = 1}) answer = answer and dever.json.node(document, -1) == null and dever.json.property(document, 0, "answer") == null document.root = 0 answer = answer and dever.json.stringify(document) == "null" and length(document.nodes) == 3 empty = dever.json.value.Value.Object({}) filled = dever.json.value.Value.Object({"first" = 1, "second" = 2}) answer = answer and objectSize(empty) == 0 and objectSize(filled) == 2 copied = put(objectMembers(filled), "third", 3) answer = answer and length(copied) == 3 and objectSize(filled) == 2 answer = answer and length(objectMembers(empty)) == 0 answer = answer and objectSize(dever.json.value.Value.Array([0, 1])) == 0 } objectSize(value: dever.json.value.Value.Object(members)) (answer: Int) { answer = length(members) } objectSize(value: dever.json.value.Value.Null) (answer: Int) { answer = 0 } objectSize(value: dever.json.value.Value.Boolean(flag)) (answer: Int) { answer = 0 } objectSize(value: dever.json.value.Value.Number(raw)) (answer: Int) { answer = 0 } objectSize(value: dever.json.value.Value.String(text)) (answer: Int) { answer = 0 } objectSize(value: dever.json.value.Value.Array(children)) (answer: Int) { answer = 0 } objectMembers(value: dever.json.value.Value.Object(members)) (answer: Map) { answer = members } objectMembers(value: dever.json.value.Value.Null) (answer: Map) { answer = {} } objectMembers(value: dever.json.value.Value.Boolean(flag)) (answer: Map) { answer = {} } objectMembers(value: dever.json.value.Value.Number(raw)) (answer: Map) { answer = {} } objectMembers(value: dever.json.value.Value.String(text)) (answer: Map) { answer = {} } objectMembers(value: dever.json.value.Value.Array(children)) (answer: Map) { answer = {} } nativeValueVerify() (answer: Bool) { empty = dever.json.value.Value.Object({}) value = dever.json.value.Value.Object({"answer" = 1}) answer = objectSize(empty) == 0 and objectSize(value) == 1 answer = answer and objectMembers(value) == {"answer" = 1} answer = answer and length(objectMembers(dever.json.value.Value.Null)) == 0 } propertyFailed(result: dever.json.PropertyResult.Found(value)) (answer: Bool) recover("测试非对象失败") { answer = false } propertyFailed(result: dever.json.PropertyResult.Failed(message)) (answer: Bool) recover("测试非对象失败") { answer = length(message) > 0 } writeFailed(result: dever.json.value.WriteResult.Written(text)) (answer: Bool) recover("检查手工文档错误") { answer = false } writeFailed(result: dever.json.value.WriteResult.Failed(node, message)) (answer: Bool) recover("检查手工文档错误") { answer = node == 1 and length(message) > 0 } encodeFailed(result: dever.json.JsonResult.Parsed(value)) (answer: Bool) recover("检查非有限数编码错误") { answer = false } encodeFailed(result: dever.json.JsonResult.Failed(message)) (answer: Bool) recover("检查非有限数编码错误") { answer = length(message) > 0 } failureVerify() (answer: Bool) { value = dever.json.fromText("42") document = dever.json.value.Document { root = 1, nodes = [dever.json.value.Value.Null, dever.json.value.Value.Array([1])] } property = propertyFailed(result(dever.json.propertyValue(value, "name"))) write = writeFailed(result(dever.json.stringify(document))) encode = encodeFailed(result(dever.json.encode(float.parse("NaN")))) deepest = dever.json.fromText("[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]") array = encodeFailed(result(dever.json.array([deepest]))) answer = property and write and encode and array missing = dever.json.value.Document { root = 1, nodes = [dever.json.value.Value.Null] } negative = dever.json.value.Document { root = 1, nodes = [dever.json.value.Value.Null, dever.json.value.Value.Array([-1])] } large = dever.json.value.Document { root = 1, nodes = [dever.json.value.Value.Null, dever.json.value.Value.Array([4294967296])] } answer = answer and writeFailed(result(dever.json.stringify(missing))) answer = answer and writeFailed(result(dever.json.stringify(negative))) answer = answer and writeFailed(result(dever.json.stringify(large))) invalid = dever.json.value.Document { root = 1, nodes = [dever.json.value.Value.Null, dever.json.value.Value.Number("invalid")] } answer = answer and writeFailed(result(dever.json.stringify(invalid))) }