include :assert

add_results setup name: "JSON" {
  include :json

  assert_encodes = { input |
    assert_equal input, json.parse json.encode input
  }

  assert_parses = { input, value |
    assert_equal value, json.parse input
  }

  test "empty array" { assert_parses '[]' [] }
  
  test "single elemeny array" { assert_parses '[1]' [1] }
  
  test "two element array"  { assert_parses '[1,2]' [1, 2] }
  
  test "three element array" { assert_parses '[1,2,3]' [1, 2, 3] }
  
  test "string in array" { assert_parses '["x"]' ["x"] }
  
  test "array in array" { assert_parses '[["x"]]' [["x"]] }
  
  test "true in array" { assert_parses '[true]' [true] }
  
  test "null and false in array" { assert_parses '[null,false]' [null, false] }
  
  test "three different types in array" { assert_parses '["a",1,false]' ["a" 1 false] }
  
  test "nested array" { assert_parses '[[1]]' [[1]] }
  
  test "multiple nested arrays" { assert_parses '[1,[2],[[["z"]]]]' [1, [2], [[["z"]]]] }

  test "simple object" { assert_parses '{"x":1}' [x: 1] }

  test "multiple keys" { 
    assert_parses '{"x":1,"y":"z"}' [x: 1, y: :z] 
  }
  
  test "object value" { assert_parses '{"x":1,"z":{"y":2}}' [ x: 1, z: [y: 2] ] }

  test "array value" { 
    assert_parses '{"Array":[1,2,3],"Object":{"nested":"objects"}}' [Array: [1 2 3], Object: [nested: :objects]]
  }

  test "encodes empty array" {
    assert_encodes []
  }

  test "encodes integer array" {
    assert_encodes [1 2 3]
  }

  test "encodes string array" {
    assert_encodes [:A :b :C]
  }

  test "encodes simple hash" {
    assert_encodes [a: 1]
  }

  test "encodes string hash" {
    assert_encodes [a: :b]
  }

  test "encodes nested values" {
    assert_encodes [a: [ "g" : [ 2 3 ], z: 26 ]]
  }
}