aboutsummaryrefslogtreecommitdiff
path: root/test/test_template.ml
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_template.ml')
-rw-r--r--test/test_template.ml31
1 files changed, 28 insertions, 3 deletions
diff --git a/test/test_template.ml b/test/test_template.ml
index dee281b..cfb3b04 100644
--- a/test/test_template.ml
+++ b/test/test_template.ml
@@ -42,12 +42,36 @@ let test_unterminated_tag_is_an_error () =
(* The safety promise (spec section 5): a template is data, never a program.
There is no raw/triple-brace form to opt out of escaping, and no partial. *)
let test_no_raw_or_partial_form () =
- Alcotest.(check bool) "triple brace is not an unescaped var" true
- (match T.parse "{{{name}}}" with Ok [ T.Var [ "{name" ] ] -> false | Ok _ -> true | Error _ -> true);
+ (* {{{name}}} is not a triple-brace "unescaped" form -- there is no such
+ form in this engine, so this assertion states what parsing it ACTUALLY
+ produces rather than gesturing at a guarantee it cannot check: the
+ lexer only recognises double braces, so it reads an ordinary var whose
+ path is the literal string "{name", then a leftover "}" as text. The
+ real guarantee against a raw form is structural, not this assertion:
+ [node] has exactly four constructors -- Text, Var, Section, Inverted --
+ and none of them is raw/unescaped. If [node] ever grows a fifth, raw
+ constructor, this test is not what will catch it. *)
+ Alcotest.(check bool) "triple brace parses as var + stray text" true
+ (parse_ok "{{{name}}}" = [ T.Var [ "{name" ]; T.Text "}" ]);
match T.parse "{{>partial}}" with
| Error _ -> ()
| Ok _ -> Alcotest.fail "partials must not parse: a template may not pull in another file"
+(* No "current context" concept exists in this engine (sections push an
+ object; lookup falls back outward), so a bare-dot or empty-sigil path has
+ no meaning. Reject at parse time rather than inventing behaviour Task 3's
+ renderer would otherwise have to define for a case nobody designed. *)
+let test_empty_path_is_an_error () =
+ let expect_error label s =
+ match T.parse s with
+ | Error _ -> ()
+ | Ok _ -> Alcotest.failf "%s: an empty tag path must be a parse error" label
+ in
+ expect_error "{{.}}" "{{.}}";
+ expect_error "{{ . }}" "{{ . }}";
+ expect_error "{{#}}{{/}}" "{{#}}{{/}}";
+ expect_error "{{^}}{{/}}" "{{^}}{{/}}"
+
let suite =
( "Template/parse",
[ Alcotest.test_case "plain text" `Quick test_plain_text;
@@ -58,4 +82,5 @@ let suite =
Alcotest.test_case "unclosed section errors" `Quick test_unclosed_section_is_an_error;
Alcotest.test_case "mismatched close errors" `Quick test_mismatched_close_is_an_error;
Alcotest.test_case "unterminated tag errors" `Quick test_unterminated_tag_is_an_error;
- Alcotest.test_case "no raw or partial form" `Quick test_no_raw_or_partial_form ] )
+ Alcotest.test_case "no raw or partial form" `Quick test_no_raw_or_partial_form;
+ Alcotest.test_case "empty path errors" `Quick test_empty_path_is_an_error ] )