module ddparser.tests;

import ddparser;
import std.stdio;

version (unittest) Grammar createGrammar()
{
    Grammar g = new Grammar();
    g
    << `EXPRESSION: EXPRESSION '+' EXPRESSION` << (c)
    {
        //writeln("EXPRESSION: ", c[0], " + ", c[2]);
    }
    << ` | INT_LITERAL` << g.propagate
    << `INT_LITERAL: "[0-9]+"` << (c)
    {
        //writeln("Parsed literal: ", c[0].stringValue);
    }
    ;
    return g;
}

version(unittest) bool testParser()
{
    Grammar g = createGrammar();

    Parser p = new Parser();
    p.setGrammar(g) || assert(false, "Invalid grammar");

    auto result = p.parse("123 + 456");
    assert(result.toString() == "EXPRESSION[INT_LITERAL['123'], '+', INT_LITERAL['456']]", "Unexpected parse result");
    return true;
}

unittest
{
    //enum t = testParser();
    assert(testParser());
}

unittest
{
    Grammar g = createGrammar();
    assert(g.rootSymbol == "EXPRESSION");
    g.rootSymbol = "INT_LITERAL";
    assert(g.rootSymbol == "INT_LITERAL");
    g.rootSymbol = "EXPRESSION";
    assert(g.rootSymbol == "EXPRESSION");
}