public void TestIndirectRecursionLoop3()
{
Grammar g = new Grammar(
"parser grammar t;\n" +
"s : a ;\n" +
"a : i b X ;\n" + // should see through i
"b : a B ;\n" +
"i : ;\n" +
"d : e ;\n" +
"e : d ;\n" );
DecisionProbe.verbose = true; // make sure we get all error info
ErrorQueue equeue = new ErrorQueue();
ErrorManager.SetErrorListener( equeue );
var leftRecursive = g.GetLeftRecursiveRules();
var expectedRules = new HashSet<string>() { "a", "b", "d", "e" };
Assert.IsTrue( expectedRules.SequenceEqual( ruleNames( leftRecursive ) ) );
Assert.AreEqual(1, equeue.errors.Count);
Message msg = equeue.errors[0];
Assert.IsTrue(msg is LeftRecursionCyclesMessage, "expecting left recursion cycles; found " + msg.GetType().Name);
LeftRecursionCyclesMessage cyclesMsg = (LeftRecursionCyclesMessage)msg;
// cycle of [a, b]
ICollection result = cyclesMsg.cycles;
var expecting = new HashSet<string>() { "a", "b", "d", "e" };
Assert.IsTrue( expecting.SequenceEqual( ruleNames2( result ) ) );
}