chiark / gitweb /
Main template expander and some built-in expansions. All untested.
[disorder] / lib / t-macros.c
index 77164d89aef10fa79125af0374279aefb2206534..cff502742718e8a98280579cdc5422257f5096dd 100644 (file)
@@ -32,104 +32,141 @@ static void test_macros(void) {
 
   /* Almost as simple as that */
   m = mx_parse("plaintext1", 1, plain, NULL);
-  insist(m->type == MX_TEXT);
+  check_integer(m->type, MX_TEXT);
   check_string(m->filename, "plaintext1");
-  insist(m->line == 1);
+  check_integer(m->line, 1);
   check_string(m->text, L1 L2);
   insist(m->next == 0);
+  check_string(mx_dump(m), plain);
 
   /* Check that partial parses stop in the right place */
   m = mx_parse("plaintext2", 5, plain, plain + strlen(L1));
-  insist(m->type == MX_TEXT);
+  check_integer(m->type, MX_TEXT);
   check_string(m->filename, "plaintext2");
-  insist(m->line == 5);
+  check_integer(m->line, 5);
   check_string(m->text, L1);
   insist(m->next == 0);
+  check_string(mx_dump(m), L1);
 
   /* The simplest possible expansion */
   m = mx_parse("macro1", 1, "@macro@", NULL);
-  insist(m->type == MX_EXPANSION);
+  check_integer(m->type, MX_EXPANSION);
   check_string(m->filename, "macro1");
-  insist(m->line == 1);
+  check_integer(m->line, 1);
   check_string(m->name, "macro");
-  insist(m->nargs == 0);
+  check_integer(m->nargs, 0);
   insist(m->args == 0);
   insist(m->next == 0);
+  check_string(mx_dump(m), "@macro@");
 
   /* Spacing variants of the above */
   m = mx_parse("macro2", 1, "@    macro@", NULL);
-  insist(m->type == MX_EXPANSION);
+  check_integer(m->type, MX_EXPANSION);
   check_string(m->filename, "macro2");
-  insist(m->line == 1);
+  check_integer(m->line, 1);
   check_string(m->name, "macro");
-  insist(m->nargs == 0);
+  check_integer(m->nargs, 0);
   insist(m->args == 0);
   insist(m->next == 0);
+  check_string(mx_dump(m), "@macro@");
   m = mx_parse("macro3", 1, "@macro    @", NULL);
-  insist(m->type == MX_EXPANSION);
+  check_integer(m->type, MX_EXPANSION);
   check_string(m->filename, "macro3");
-  insist(m->line == 1);
+  check_integer(m->line, 1);
   check_string(m->name, "macro");
-  insist(m->nargs == 0);
+  check_integer(m->nargs, 0);
   insist(m->args == 0);
   insist(m->next == 0);
+  check_string(mx_dump(m), "@macro@");
 
   /* Unterminated variants */
   m = mx_parse("macro4", 1, "@macro", NULL);
-  insist(m->type == MX_EXPANSION);
+  check_integer(m->type, MX_EXPANSION);
   check_string(m->filename, "macro4");
-  insist(m->line == 1);
+  check_integer(m->line, 1);
   check_string(m->name, "macro");
-  insist(m->nargs == 0);
+  check_integer(m->nargs, 0);
   insist(m->args == 0);
   insist(m->next == 0);
+  check_string(mx_dump(m), "@macro@");
   m = mx_parse("macro5", 1, "@macro   ", NULL);
-  insist(m->type == MX_EXPANSION);
+  check_integer(m->type, MX_EXPANSION);
   check_string(m->filename, "macro5");
-  insist(m->line == 1);
+  check_integer(m->line, 1);
   check_string(m->name, "macro");
-  insist(m->nargs == 0);
+  check_integer(m->nargs, 0);
   insist(m->args == 0);
   insist(m->next == 0);
+  check_string(mx_dump(m), "@macro@");
 
   /* Macros with a :-separated argument */
   m = mx_parse("macro5", 1, "@macro:arg@", NULL);
-  insist(m->type == MX_EXPANSION);
+  check_integer(m->type, MX_EXPANSION);
   check_string(m->filename, "macro5");
-  insist(m->line == 1);
+  check_integer(m->line, 1);
   check_string(m->name, "macro");
-  insist(m->nargs == 1);
+  check_integer(m->nargs, 1);
   insist(m->next == 0);
   
-  insist(m->args[0]->type == MX_TEXT);
+  check_integer(m->args[0]->type, MX_TEXT);
   check_string(m->args[0]->filename, "macro5");
-  insist(m->args[0]->line == 1);
+  check_integer(m->args[0]->line, 1);
   check_string(m->args[0]->text, "arg");
   insist(m->args[0]->next == 0);
 
+  check_string(mx_dump(m), "@macro{arg}@");
+
   /* Multiple :-separated arguments, and spacing, and newlines */
   m = mx_parse("macro6", 1, "@macro : \n arg1 : \n arg2@", NULL);
-  insist(m->type == MX_EXPANSION);
+  check_integer(m->type, MX_EXPANSION);
   check_string(m->filename, "macro6");
-  insist(m->line == 1);
+  check_integer(m->line, 1);
   check_string(m->name, "macro");
-  insist(m->nargs == 2);
+  check_integer(m->nargs, 2);
   insist(m->next == 0);
   
-  insist(m->args[0]->type == MX_TEXT);
+  check_integer(m->args[0]->type, MX_TEXT);
   check_string(m->args[0]->filename, "macro6");
-  insist(m->args[0]->line == 2);
+  check_integer(m->args[0]->line, 2);
   check_string(m->args[0]->text, "arg1");
   insist(m->args[0]->next == 0);
   
-  insist(m->args[1]->type == MX_TEXT);
+  check_integer(m->args[1]->type, MX_TEXT);
   check_string(m->args[1]->filename, "macro6");
-  insist(m->args[1]->line == 3);
+  check_integer(m->args[1]->line, 3);
   check_string(m->args[1]->text, "arg2");
   insist(m->args[1]->next == 0);
 
-  
+  check_string(mx_dump(m), "@macro{arg1}{arg2}@");
+
+  /* Multiple bracketed arguments */
+  m = mx_parse("macro7", 1, "@macro{arg1}{arg2}@", NULL);
+  check_string(mx_dump(m), "@macro{arg1}{arg2}@");
+
+  m = mx_parse("macro8", 1, "@macro{\narg1}{\narg2}@", NULL);
+  check_string(mx_dump(m), "@macro{\narg1}{\narg2}@");
+  check_integer(m->args[0]->line, 1);
+  check_integer(m->args[1]->line, 2);
+  /* ...yes, lines 1 and 2: the first character of the first arg is
+   * the \n at the end of line 1.  Compare with macro9: */
+
+  m = mx_parse("macro9", 1, "@macro\n{arg1}\n{arg2}@", NULL);
+  check_string(mx_dump(m), "@macro{arg1}{arg2}@");
+  check_integer(m->args[0]->line, 2);
+  check_integer(m->args[1]->line, 3);
+
+  /* Arguments that themselves contain expansions */
+  m = mx_parse("macro10", 1, "@macro{@macro2{arg1}{arg2}@}@", NULL);
+  check_string(mx_dump(m), "@macro{@macro2{arg1}{arg2}@}@");
+
+  /* ...and with omitted trailing @ */
+  m = mx_parse("macro11", 1, "@macro{@macro2{arg1}{arg2}}", NULL);
+  check_string(mx_dump(m), "@macro{@macro2{arg1}{arg2}@}@");
 
+  /* Similarly but with more whitespace; NB that the whitespace is
+   * preserved. */
+  m = mx_parse("macro12", 1, "@macro {@macro2 {arg1} {arg2}  }\n", NULL);
+  check_string(mx_dump(m), "@macro{@macro2{arg1}{arg2}@  }@\n");
 }
 
 TEST(macros);