package dtool.parser; import static melnorme.utilbox.core.Assert.AssertNamespace.assertFail; import dtool.parser.common.Token; import melnorme.utilbox.misc.ArrayUtil; public class SourceEquivalenceChecker { public static void assertCheck(String source, String expectedSource, DeeTokens... additionalIgnores) { check(source, expectedSource, true, additionalIgnores); } public static boolean check(String source, String expectedSource) { return check(source, expectedSource, false); } public static boolean check(String source, String expectedSource, boolean failOnUnequal, DeeTokens... additionalIgnores) { DeeLexer generatedSourceLexer = new DeeLexer(source); DeeLexer expectedSourceLexer = new DeeLexer(expectedSource); while(true) { Token tok = getContentToken(generatedSourceLexer, true, additionalIgnores); Token tokExp = getContentToken(expectedSourceLexer, true, additionalIgnores); if(tok.type.equals(tokExp.type) && tok.source.equals(tokExp.source)) { } else if(failOnUnequal) { assertFail(); } else { return false; } if(tok.type == DeeTokens.EOF) { return true; } } } public static Token getContentToken(DeeLexer lexer, boolean ignoreComments, DeeTokens... additionalIgnores) { while(true) { Token token = lexer.next(); DeeTokens type = token.type; if((type.isSubChannel && (type.getGroupingToken() != DeeTokens.GROUP_COMMENT || ignoreComments)) || (ArrayUtil.contains(additionalIgnores, type))) continue; return token; } } }