Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file test_character.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670openFmlib_stdmoduleCP=Character.Make(Unit)(Char)(Unit)moduleIP=Character.Make(Unit)(Int)(Unit)moduleSP=Character.Make(Unit)(String)(Unit)(*
One Token
------------------------------------------------------------
*)let%test_=letopenCPinletp=Parser.run_on_string"a"(make()letter)inParser.has_succeededp&&Parser.columnp=1&&Parser.finalp='a'&&Parser.lookaheadsp=([||],true)let%test_=letopenCPinletp=Parser.run_on_string","(make()letter)inParser.has_failed_syntaxp&&Parser.columnp=0&&Parser.lookaheadsp=([|','|],false)let%test_=letopenCPinletp=Parser.run_on_string"ab"(make()letter)inParser.has_failed_syntaxp&&Parser.columnp=1&&Parser.lookaheadsp=([|'b'|],false)let%test_=letopenCPinletp=Parser.run_on_string"a"(make()(char'a'</>char'b'))inParser.has_succeededp&&Parser.finalp='a'let%test_=letopenCPinletp=Parser.run_on_string"b"(make()(char'a'</>char'b'))inParser.has_succeededp&&Parser.finalp='b'let%test_=letopenIPinletp=Parser.run_on_string"F"(make()hex_digit)inParser.(has_succeededp&&finalp=15)(*
Backtracking
------------------------------------------------------------
*)let%test_=letopenSPinletp=Parser.run_on_string"(a)"(make()(string"(a)"</>string"(b)"))inParser.has_succeededp&&Parser.finalp="(a)"let%test_=letopenSPinletp=Parser.run_on_string"(b)"(make()(string"(a)"</>string"(b)"))inParser.has_failed_syntaxp&&Parser.columnp=1&&Parser.failed_expectationsp=["'a'",None]let%test_=letopenSPinletp=Parser.run_on_string"(b)"(make()(backtrack(string"(a)")"(a)"</>string"(b)"))inParser.has_succeededp&&Parser.finalp="(b)"let%test_=letopenCharacter.Make(Unit)(String)(Unit)inletp=Parser.run_on_string"ab"(make()(string"abc"))inParser.(letla,la_end=lookaheadspincolumnp=2&&has_failed_syntaxp&&Array.is_emptyla&&la_end&&has_lookaheadp)let%test_=letopenCharacter.Make(Unit)(String)(Unit)inletp=Parser.run_on_string"ab"(make()(backtrack(string"abc")"abc"</>string"ab"))inParser.(letla,la_end=lookaheadspincolumnp=2&&has_succeededp&&finalp="ab"&&Array.is_emptyla&&la_end&¬(has_lookaheadp))(*
Nested Backtracking
------------------------------------------------------------
*)letabcdef=SP.(backtrack(let*s1=string"abc"inlet*s2=backtrack(string"def")"def"</>string"dez"inreturn(s1^s2))"abcdef")let%test_=letopenSPinletp=Parser.run_on_string"abcdeg"(make()abcdef)inParser.has_failed_syntaxp&&Parser.columnp=0&&Parser.failed_expectationsp=["abcdef",None]let%test_=letopenSPinletp=Parser.run_on_string"abcdef"(make()abcdef)inParser.has_succeededp&&Parser.finalp="abcdef"let%test_=letopenSPinletp=Parser.run_on_string"abcdez"(make()abcdef)inParser.has_succeededp&&Parser.finalp="abcdez"(*
Followed by and not followed by
------------------------------------------------------------
*)let%test_=(* "abc" followed by "def". Success case. *)letopenSPinletp=let*str=string"abc"inlet*_=followed_by(string"def")"def"inreturnstrinletp=Parser.run_on_string"abcdef"(make_partialPosition.start()p)inParser.has_succeededp&&Parser.finalp="abc"&&Parser.columnp=3let%test_=(* "abc" followed by "def". Failure case. *)letopenSPinletp=let*str=string"abc"inlet*_=followed_by(string"def")"def"inreturnstrinletp=Parser.run_on_string"abcdez"(make_partialPosition.start()p)inParser.has_failed_syntaxp&&Parser.columnp=3&&Parser.failed_expectationsp=["def",None]let%test_=(* "abc" not followed by "def". Success case. *)letopenSPinletp=let*str=string"abc"inlet*_=not_followed_by(string"def")""inreturnstrinletp=Parser.run_on_string"abcdez"(make_partialPosition.start()p)inParser.has_succeededp&&Parser.finalp="abc"&&Parser.columnp=3let%test_=(* "abc" not followed by "def". Failure case. *)letopenSPinletp=let*str=string"abc"inlet*_=not_followed_by(string"def")"def"inreturnstrinletp=Parser.run_on_string"abcdef"(make_partialPosition.start()p)inParser.has_failed_syntaxp&&Parser.columnp=3&&Parser.failed_expectationsp=["def",None](*
Indentation Sensitivity
------------------------------------------------------------
*)moduleIndent_sensitive(Final:Fmlib_std.Interfaces.ANY)=structmoduleBasic=Character.Make(Unit)(Final)(Unit)includeBasicletwhitespace:intt=char' '</>char'\n'<?>"whitespace"|>(funp->skip_zero_or_morep>>=clear_last_expectation)|>detachletskip_trailing_ws(p:'at):'at=let*a=pinlet*_=whitespaceinreturnaletchar_ws(c:char):chart=skip_trailing_ws(charc)letstring_of_expectations(p:Parser.t):string=assert(Parser.has_failed_syntaxp);"["^String.concat","(List.map(fun(msg,vio)->letopenIndentin"("^msg^", "^(matchviowith|None->"None"|Some(Indenti)->"Indent "^string_of_inti|Some(Aligni)->"Align "^string_of_inti|Some(Align_between(i,j))->"Align_between "^string_of_inti^","^string_of_intj)^")")(Parser.failed_expectationsp))^"]"endlet%test_=(* an indented character *)letopenIndent_sensitive(Char)inletstr={|
a
b
|}inletp=(let*_=whitespaceinlet*_=char_ws'a'inchar_ws'b'|>indent4)|>make()|>Parser.run_on_stringstrinParser.has_succeededp&&Parser.finalp='b'&&Parser.columnp=8let%test_=(* a wrongly indented character *)letopenIndent_sensitive(Char)inletstr={|
a
b |}(* ^ column 3 *)inletp=(let*_=whitespaceinlet*_=char_ws'a'inchar_ws'b'|>indent4)|>make()|>Parser.run_on_stringstrinParser.has_failed_syntaxp&&Parser.columnp=3let%test_=(* A character left aligned. *)letopenIndent_sensitive(Char)inletp=(let*_=whitespaceinchar'a'|>left_align)|>make()|>Parser.run_on_string" \na"inParser.has_succeededp&&Parser.finalp='a'&&Parser.linep=1&&Parser.columnp=1let%test_=(* A character left aligned, but not found. *)letopenIndent_sensitive(Char)inletp=(let*_=whitespaceinchar'a'|>left_align)|>make()|>Parser.run_on_string" \n\n\n\n a"inParser.has_failed_syntaxp&&Parser.linep=4&&Parser.columnp=1&&Parser.failed_expectationsp=["'a'",Some(Indent.Align0)]let%test_=(* Two characters aligned *)letopenIndent_sensitive(Char)inletp=(let*_=whitespaceinlet*_=char_ws'a'in(let*_=char_ws'b'|>aligninchar_ws'c'|>align)|>indent0)|>make()|>Parser.run_on_string{|
a b
c
|}inParser.has_succeededplet%test_=(* Two characters indented and aligned *)letopenIndent_sensitive(Char)inletp=(let*_=whitespaceinlet*c0=char_ws'a'|>aligninlet*_=(let*_=char_ws'b'|>aligninchar_ws'c'|>align)|>indent1inreturnc0)|>make()|>Parser.run_on_string"\n\
\ a\n\
\ b\n\
\ c"inParser.has_succeededp&&Parser.linep=3&&Parser.columnp=5let%test_=(* Two characters indented and wrongly aligned *)letopenIndent_sensitive(Char)inletp=(let*_=whitespaceinlet*c0=char_ws'a'|>aligninlet*_=(let*_=char_ws'b'|>aligninchar_ws'c'|>align)|>indent1inreturnc0)|>make()|>Parser.run_on_string"\n\
\ a\n\
\ b\n\
\ c"inParser.has_failed_syntaxp&&Parser.linep=3&&Parser.columnp=5&&Parser.failed_expectationsp=["'c'",Some(Align4)]let%test_=(* Alignment without indentation *)letstr={|
a a
a
b
c
a
|}inletopenIndent_sensitive(Int)inletp=(let*_=whitespaceinlet*n=char_ws'a'|>skip_one_or_moreinlet*_=char_ws'b'|>aligninlet*_=char_ws'c'|>aligninlet*m=char_ws'a'|>skip_zero_or_moreinreturn(n+m))|>make()|>Parser.run_on_stringstrinParser.(has_succeededp&&finalp=4)let%test_=(* Alignment without indentation, failed *)letstr={|
a a a
a
b
c
|}inletopenIndent_sensitive(Int)inletp=(let*_=whitespaceinlet*n=char_ws'a'|>skip_one_or_moreinlet*_=char_ws'b'|>aligninlet*_=char_ws'c'|>aligninreturnn)|>make()|>Parser.run_on_stringstrinParser.(has_failed_syntaxp)(*
Base64 decoding
------------------------------------------------------------
*)let%test_=letopenSPinletp=base64Fun.id(fungrps->s^grp)|>make()|>Parser.run_on_string"TQ======"inParser.has_succeededp&&Parser.finalp="M"let%test_=letopenSPinletp=string_of_base64|>make()|>Parser.run_on_string"TWE====="inParser.has_succeededp&&Parser.finalp="Ma"let%test_=letopenSPinletp=string_of_base64|>make()|>Parser.run_on_string"TWFu"inParser.has_succeededp&&Parser.finalp="Man"let%test_=letopenSPinletp=string_of_base64|>make()|>Parser.run_on_string"c\n\rGxlY XN1cmUu"inParser.has_succeededp&&Parser.finalp="pleasure."let%test_=letopenSPinletp=string_of_base64|>make()|>Parser.run_on_string"c3VyZS4="inParser.has_succeededp&&Parser.finalp="sure."