type Payload { values: List, label: Text, first: Int, second: Int } type Floating { values: List, optional: Float? } type Failure { error First, error Second } encode(values: List, label: Text) (answer: Text) { payload = Payload { second = 2, label = label, values = values, first = 1 } answer = dever.json.toText(dever.json.encode(payload)) } projected(source: Payload) (answer: Text) { payload = Payload { values = source.values, label = source.label, first = source.first, second = source.second } answer = dever.json.toText(dever.json.encode(payload)) } overwritten(values: List) (answer: Text) { payload = Payload { values = values, label = "old", first = 1, second = 2 } before = dever.json.toText(dever.json.encode(payload)) payload = Payload { values = [9], label = "new", first = 3, second = 2 } payload.first = 4 answer = before + dever.json.toText(dever.json.encode(payload)) } reused(values: List) (answer: Text) { payload = Payload { values = values, label = "old", first = 1, second = 2 } before = dever.json.toText(dever.json.encode(payload)) payload.first = 4 answer = before + dever.json.toText(dever.json.encode(payload)) } intervening(source: Payload) (answer: Text) { payload = Payload { values = source.values, label = source.label, first = source.first, second = source.second } source.values = [9] answer = dever.json.toText(dever.json.encode(payload)) } escaping(values: List) (answer: Payload) { payload = Payload { values = values, label = "old", first = 1, second = 2 } answer = payload } finite(values: List, optional: Float?) (answer: Json) { payload = Floating { values = values, optional = optional } answer = dever.json.encode(payload) } failed(value: dever.json.JsonResult.Parsed(document)) (answer: Bool) recover("检查视图有限值") { answer = false } failed(value: dever.json.JsonResult.Failed(message)) (answer: Bool) recover("检查视图有限值") { answer = message == "non-finite Float cannot be encoded" } firstFail(stop: true) (answer: Int) { fail(Failure.First) } firstFail(stop: false) (answer: Int) { answer = 1 } secondFail(stop: true) (answer: Int) { fail(Failure.Second) } secondFail(stop: false) (answer: Int) { answer = 2 } failureOrder(values: List, stop: Bool) (answer: Text) { payload = Payload { values = values, second = secondFail(stop), first = firstFail(stop), label = "old" } answer = dever.json.toText(dever.json.encode(payload)) } faultEntry() (answer: Int) { values = [1, 2, 3] text = failureOrder(values, true) answer = length(text) + sum(values) } verify() (answer: Bool) { values = [1, 2, 3] label = "old" expected = "{\"values\":[1,2,3],\"label\":\"old\",\"first\":1,\"second\":2}" source = Payload { values = values, label = label, first = 1, second = 2 } answer = encode(values, label) == expected and projected(source) == expected answer = answer and overwritten(values) == expected + "{\"values\":[9],\"label\":\"new\",\"first\":4,\"second\":2}" answer = answer and reused(values) == expected + "{\"values\":[1,2,3],\"label\":\"old\",\"first\":4,\"second\":2}" answer = answer and intervening(source) == expected and escaping(values) == source answer = answer and failureOrder(values, false) == expected answer = answer and sum(values) == 6 and label == "old" and sum(source.values) == 6 numbers = [float.parse("NaN")] answer = answer and failed(result(finite(numbers, null))) and length(numbers) == 1 finite_values = [float.parse("1")] answer = answer and failed(result(finite(finite_values, float.parse("inf")))) and length(finite_values) == 1 answer = answer and failed(result(finite([float.parse("-inf")], null))) answer = answer and encode([1, 2, 3], "old") == expected answer = answer and fragmentsVerify() } type Fragment { label: Text, value: Json } fragments(values: List) (answer: Text) { answer = dever.json.toText(dever.json.encode(values)) } fragmentsVerify() (answer: Bool) { value = dever.json.fromText(" \n{\"a\":[1e9999,-0]}\t ") row = Fragment { label = "雪\"", value = value } expected = "[{\"label\":\"雪\\\"\",\"value\":{\"a\":[1e9999,-0]}},null]" answer = fragments([row, null]) == expected and fragments([row, null]) == expected answer = answer and dever.json.toText(value) == " \n{\"a\":[1e9999,-0]}\t " }