| import Lean.Data.Json.Parser | |
| import Lean.Data.Json.Printer | |
| import Lean.Data.Json | |
| import Lean | |
| def test (s : String) : String := | |
| match Lean.Json.parse s with | |
| | Except.ok res => toString res | |
| | Except.error err => err | |
| #eval test "null" | |
| #eval test "false" | |
| #eval test "true" | |
| #eval test "123.456e-7" | |
| #eval test "123.456e+7" | |
| #eval test "-0.01e8" | |
| #eval test "\"\"" | |
| #eval test "\"abc\"" | |
| #eval test "[true, 123, \"foo\", []]" | |
| #eval test "{\"a\": 1.2, \"b\": \"foo\", \"c\": null, \"d\": {\"foo\": \"bar\"}, \"e\": [{}]}" | |
| #eval test "[false_]" | |
| #eval test "[" | |
| #eval test "]" | |
| #eval test "{" | |
| #eval test "\"" | |
| #eval test "1." | |
| #eval test "{foo: 1}" | |
| #eval test " " | |
| #eval toString (Lean.Json.num ⟨20, 1⟩) | |
| #eval toString (Lean.Json.num ⟨-20, 1⟩) | |
| #eval toString (Lean.Json.num 0.1) | |
| #eval toString (Lean.Json.num <| -0.1) | |
| #eval toString (Lean.Json.num <| -0.01e8) | |
| #eval toString (Lean.Json.num <| 123.456e-7) | |
| #eval 123.456e-7 == Lean.JsonNumber.toFloat 123.456e-7 | |
| #eval -123.456e-7 == Lean.JsonNumber.toFloat (-123.456e-7) | |
| #eval 123.456e20 == Lean.JsonNumber.toFloat 123.456e20 | |
| #eval 0.0 == Lean.JsonNumber.toFloat 0 | |
| open Lean Json | |
| def floatRoundtrip (x : Float) : CoreM Unit := do | |
| let j := x |> toJson | |
| let y ← j |> fromJson? (α := Float) |> ofExcept | |
| dbg_trace "{y}" | |
| if y.isNaN && x.isNaN then | |
| -- [note] NaN ≠ NaN | |
| return () | |
| if y != x then | |
| throwError "failure {x} → {j} → {y}" | |
| return () | |
| #eval floatRoundtrip 0.0 | |
| #eval floatRoundtrip (-0.0) | |
| #eval floatRoundtrip 1.0 | |
| #eval floatRoundtrip (-1.0) | |
| #eval floatRoundtrip (1e100) | |
| #eval floatRoundtrip (123456789e-6) | |
| #eval floatRoundtrip (0.0 / 0.0) | |
| #eval floatRoundtrip (1.0 / 0.0) | |
| #eval floatRoundtrip (-1.0 / 0.0) | |
| structure Test1 where | |
| hello : String | |
| cheese? : Option Nat | |
| deriving ToJson, FromJson, Repr | |
| structure Test2 where | |
| jam: Test1 | |
| deriving ToJson, FromJson, Repr | |
| #eval fromJson? (α := Test2) <| Json.mkObj [("jam", Json.mkObj [("hello", "world")])] | |
| #eval fromJson? (α := Test2) <| Json.mkObj [("jam", Json.mkObj [("hello", 4)])] |