%% vim:ft=erlang:

%% TEST
{setup,
  fun() ->
      application:start(yamerl)
  end,
  [
    ?_assertMatch(
      [
        [
          "true", "True", "TRUE",
          "y", "Y",
          "yes", "Yes", "YES",
          "on", "On", "ON",
          "false", "False", "FALSE",
          "n", "N",
          "no", "No", "NO",
          "off", "Off", "OFF",
          "Not a bool"
        ]
      ],
      yamerl_constr:file("${FILENAME}",
        [{detailed_constr, false}, {schema, failsafe}])
    ),
    ?_assertThrow(
      {yamerl_exception, [
          {yamerl_parsing_error,error, "Invalid string", 2, 3, not_a_string,
            {yamerl_scalar, 2, 3,
              {yamerl_tag, 2, 3, {non_specific, "?"}},
              flow, plain, "True"},
            []}]},
      yamerl_constr:file("${FILENAME}",
        [{detailed_constr, false}, {schema, json}])
    ),
    ?_assertMatch(
      [
        [
          true, true, true,
          "y", "Y",
          "yes", "Yes", "YES",
          "on", "On", "ON",
          false, false, false,
          "n", "N",
          "no", "No", "NO",
          "off", "Off", "OFF",
          "Not a bool"
        ]
      ],
      yamerl_constr:file("${FILENAME}",
        [{detailed_constr, false}, {schema, core}])
    ),
    ?_assertMatch(
      [
        [
          true, true, true,
          true, true,
          true, true, true,
          true, true, true,
          false, false, false,
          false, false,
          false, false, false,
          false, false, false,
          "Not a bool"
        ]
      ],
      yamerl_constr:file("${FILENAME}",
        [{detailed_constr, false}, {schema, failsafe},
          {node_mods, [yamerl_node_bool_ext]}])
    ),
    ?_assertMatch(
      [
        {yamerl_doc,
          {yamerl_seq,yamerl_node_seq,"tag:yaml.org,2002:seq",
            [{line,1},{column,1}],
            [{yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,1},{column,3}],
                "true"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,2},{column,3}],
                "True"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,3},{column,3}],
                "TRUE"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,4},{column,3}],
                "y"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,5},{column,3}],
                "Y"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,6},{column,3}],
                "yes"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,7},{column,3}],
                "Yes"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,8},{column,3}],
                "YES"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,9},{column,3}],
                "on"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,10},{column,3}],
                "On"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,11},{column,3}],
                "ON"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,13},{column,3}],
                "false"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,14},{column,3}],
                "False"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,15},{column,3}],
                "FALSE"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,16},{column,3}],
                "n"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,17},{column,3}],
                "N"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,18},{column,3}],
                "no"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,19},{column,3}],
                "No"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,20},{column,3}],
                "NO"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,21},{column,3}],
                "off"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,22},{column,3}],
                "Off"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,23},{column,3}],
                "OFF"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,25},{column,3}],
                "Not a bool"}],
            23}
        }
      ],
      yamerl_constr:file("${FILENAME}",
        [{detailed_constr, true}, {schema, failsafe}])
    ),
    ?_assertThrow(
      {yamerl_exception, [
          {yamerl_parsing_error,error, "Invalid string", 2, 3, not_a_string,
            {yamerl_scalar, 2, 3,
              {yamerl_tag, 2, 3, {non_specific, "?"}},
              flow, plain, "True"},
            []}]},
      yamerl_constr:file("${FILENAME}",
        [{detailed_constr, true}, {schema, json}])
    ),
    ?_assertMatch(
      [
        {yamerl_doc,
          {yamerl_seq,yamerl_node_seq,"tag:yaml.org,2002:seq",
            [{line,1},{column,1}],
            [{yamerl_bool,yamerl_node_bool,"tag:yaml.org,2002:bool",
                [{line,1},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool,"tag:yaml.org,2002:bool",
                [{line,2},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool,"tag:yaml.org,2002:bool",
                [{line,3},{column,3}],
                true},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,4},{column,3}],
                "y"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,5},{column,3}],
                "Y"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,6},{column,3}],
                "yes"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,7},{column,3}],
                "Yes"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,8},{column,3}],
                "YES"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,9},{column,3}],
                "on"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,10},{column,3}],
                "On"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,11},{column,3}],
                "ON"},
              {yamerl_bool,yamerl_node_bool,"tag:yaml.org,2002:bool",
                [{line,13},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool,"tag:yaml.org,2002:bool",
                [{line,14},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool,"tag:yaml.org,2002:bool",
                [{line,15},{column,3}],
                false},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,16},{column,3}],
                "n"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,17},{column,3}],
                "N"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,18},{column,3}],
                "no"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,19},{column,3}],
                "No"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,20},{column,3}],
                "NO"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,21},{column,3}],
                "off"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,22},{column,3}],
                "Off"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,23},{column,3}],
                "OFF"},
              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,25},{column,3}],
                "Not a bool"}],
            23}
        }
      ],
      yamerl_constr:file("${FILENAME}",
        [{detailed_constr, true}, {schema, core}])
    ),
    ?_assertMatch(
      [
        {yamerl_doc,
          {yamerl_seq,yamerl_node_seq,"tag:yaml.org,2002:seq",
            [{line,1},{column,1}],
            [{yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,1},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,2},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,3},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,4},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,5},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,6},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,7},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,8},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,9},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,10},{column,3}],
                true},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,11},{column,3}],
                true},

              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,13},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,14},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,15},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,16},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,17},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,18},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,19},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,20},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,21},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,22},{column,3}],
                false},
              {yamerl_bool,yamerl_node_bool_ext,"tag:yaml.org,2002:bool",
                [{line,23},{column,3}],
                false},

              {yamerl_str,yamerl_node_str,"tag:yaml.org,2002:str",
                [{line,25},{column,3}],
                "Not a bool"}],
            23}
        }
      ],
      yamerl_constr:file("${FILENAME}",
        [{detailed_constr, true}, {schema, failsafe},
          {node_mods, [yamerl_node_bool_ext]}])
    )
  ]
}
