dune/test/unit-tests/sexp_tests.ml

62 lines
2.1 KiB
OCaml

open! Stdune
let () = Printexc.record_backtrace true
(* Test that all strings of length <= 3 such that [Usexp.Atom.is_valid
s] are recignized as atoms by the parser *)
let string_of_syntax (x : Usexp.syntax) =
match x with
| Dune -> "dune"
| Jbuild -> "jbuild"
let () =
[ Usexp.Dune, Usexp.Lexer.token, (fun s -> Usexp.Atom.is_valid s Dune)
; Jbuild, Usexp.Lexer.jbuild_token, (fun s -> Usexp.Atom.is_valid s Jbuild)
]
|> List.iter ~f:(fun (syntax, lexer, validator) ->
for len = 0 to 3 do
let s = Bytes.create len in
for i = 0 to 1 lsl (len * 8) - 1 do
if len > 0 then Bytes.set s 0 (Char.chr ( i land 0xff));
if len > 1 then Bytes.set s 1 (Char.chr ((i lsr 4) land 0xff));
if len > 2 then Bytes.set s 2 (Char.chr ((i lsr 8) land 0xff));
let s = Bytes.unsafe_to_string s in
let parser_recognizes_as_atom =
match Usexp.parse_string ~lexer ~fname:"" ~mode:Single s with
| exception _ -> false
| Atom (_, A s') -> s = s'
| _ -> false
in
let printed_as_atom =
match Usexp.atom_or_quoted_string s with
| Atom _ -> true
| _ -> false
in
let valid_dune_atom = validator (Usexp.Atom.of_string s) in
if valid_dune_atom <> parser_recognizes_as_atom then begin
Printf.eprintf
"Usexp.Atom.is_valid error:\n\
- syntax = %s\n\
- s = %S\n\
- Usexp.Atom.is_valid s = %B\n\
- parser_recognizes_as_atom = %B\n"
(string_of_syntax syntax) s valid_dune_atom
parser_recognizes_as_atom;
exit 1
end;
if printed_as_atom && not parser_recognizes_as_atom then begin
Printf.eprintf
"Usexp.Atom.atom_or_quoted_string error:\n\
- syntax = %s\n\
- s = %S\n\
- printed_as_atom = %B\n\
- parser_recognizes_as_atom = %B\n"
(string_of_syntax syntax) s printed_as_atom
parser_recognizes_as_atom;
exit 1
end
done
done
)