javatests/de/jflex/testcase/charclass/CharclassTest.java (266 lines of code) (raw):

/* * Copyright 2020, Google, LLC. * SPDX-License-Identifier: BSD-3-Clause */ package de.jflex.testcase.charclass; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import com.google.common.io.CharSource; import java.io.IOException; import org.junit.After; import org.junit.Test; /** Test character class syntax. */ public class CharclassTest { private CharclassScanner scanner; @After public void endOfFile() throws Exception { assertThat(scanner.yylex()).isEqualTo(State.END_OF_FILE); } @Test public void nested() throws Exception { scanner = createScanner( "4 score and 7 years ago our fathers brought forth on this continent\n" + "a new nation, living and dead who struggled here have consecrated\n" + "it far above our poor power to add or detract.\n"); assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // 4 assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // score assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // and assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // 7 assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // years assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // ago assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // our assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // fathers assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // brought assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // forth assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // on assertThat(scanner.yylex()).isEqualTo(State.NESTED_GHIJKMTS); // this assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // continent assertThat(scanner.yylex()).isEqualTo(State.NESTED_ABCDEF); // a assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // new assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // nation assertThat(scanner.yylex()).isEqualTo(State.INTER_PUNCTUATION1); // , assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // living assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // and assertThat(scanner.yylex()).isEqualTo(State.NESTED_ABCDEF); // dead assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // who assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // struggled assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // here assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // have assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // consecrated assertThat(scanner.yylex()).isEqualTo(State.NESTED_GHIJKMTS); // it assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // far assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // above assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // our assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // poor assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // power assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // to assertThat(scanner.yylex()).isEqualTo(State.NESTED_ABCDEF); // add assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // or assertThat(scanner.yylex()).isEqualTo(State.NESTED_AZ47); // detract assertWithMessage("/[-.~~-/]+/ matched '.'").that(scanner.yylex()).isEqualTo(State.SYM_2); // . } @Test public void test() throws Exception { scanner = createScanner("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); assertWithMessage("/[A-G--CG-Z]+/ matched 'AB'") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_AGCGZ); assertWithMessage("/[^[^ABC--ABZ]]/ matched 'C'") .that(scanner.yylex()) .isEqualTo(State.NOT_ABC_ABZ); assertWithMessage("/[A-G--CG-Z]+/ matched 'DEF'") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_AGCGZ); assertWithMessage("/[^[^-GM---M]]+/ matched 'G'") .that(scanner.yylex()) .isEqualTo(State.NOT_GMM); assertWithMessage("/[[H-L]--K]+/ matched 'HIJ'") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_HLK); assertWithMessage("/[^[^-KO--O]]+/ matched 'K'").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[[H-L]--K]+/ matched 'L'") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_HLK); assertWithMessage("/[-M-O--N]+/ matched 'M'") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_MON); assertWithMessage("/[-N-P---P]+/ matched 'NO'") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_NPP); assertWithMessage("/[QR[-]---R]+/ matched 'Q'") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_QRR); assertWithMessage("/[^[^R[-]---]]+/ matched 'R'").that(scanner.yylex()).isEqualTo(State.NOT_R); assertWithMessage("/[\\p{Lu}--A-RT-Z]+/ matched 'S'") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_PLU); assertWithMessage("/[\\p{L}&&[T||\\p{N}]]+/ matched 'T'") .that(scanner.yylex()) .isEqualTo(State.INTER_PLN); assertWithMessage("/[-TUV&&-UA]+/ matched 'U''") .that(scanner.yylex()) .isEqualTo(State.INTER_TUV_UA); assertWithMessage("/[-TUV&&VA]+/ matched 'V'") .that(scanner.yylex()) .isEqualTo(State.INTER_TUV_AV); assertWithMessage("/[VW&&-WA]+/ matched 'W'") .that(scanner.yylex()) .isEqualTo(State.INTER_VW_WA); assertWithMessage("/[XXX&&XYZ]+/ matched 'X'") .that(scanner.yylex()) .isEqualTo(State.INTER_XXX_XYZ); assertWithMessage("/[^[^-AYZ&&-YBM]]+/ matched 'Y'") .that(scanner.yylex()) .isEqualTo(State.INTER_AYZ_YMB); assertWithMessage("/[^[^-ZR&&ABZ]]+/ matched 'Z'") .that(scanner.yylex()) .isEqualTo(State.INTER_ZR_ABZ); } @Test public void subtraction() throws Exception { scanner = createScanner( "" + "-K-\n" // /[^[^-KO--O]]+/ matched `-K-` + "-G-\n" + "-MOON-\n" + "-NOON-\n" + "-QQQ-\n" + "-RRR-\n" + "SSS\n"); assertWithMessage("/[^[^-KO--O]]+/ matched `-K-`") .that(scanner.yylex()) .isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-GM---M]]+/ matched `G`") .that(scanner.yylex()) .isEqualTo(State.NOT_GMM); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[-M-O--N]+/ matched `-MOO`") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_MON); assertWithMessage("/[-N-P---P]+/ matched `N`") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_NPP); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[-N-P---P]+/ matched `NOON`") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_NPP); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[QR[-]---R]+/ matched `QQQ`") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_QRR); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^R[-]---]]+/ matched `RRR`") .that(scanner.yylex()) .isEqualTo(State.NOT_R); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[\\p{Lu}--A-RT-Z]+/ matched `SSS`") .that(scanner.yylex()) .isEqualTo(State.SUBSTRACT_PLU); } @Test public void inter() throws Exception { scanner = createScanner( "" + "TTT\n" // /[\p{L}&&[T||\p{N}]]+/ matched `TTT` + "-UUU-\n" + "-VVV-\n" + "-WWW-\n" + "-XXX-\n" + "-YYY-\n" + "-ZZZ-"); assertWithMessage("/[\\p{L}&&[T||\\p{N}]]+/ matched `TTT`") .that(scanner.yylex()) .isEqualTo(State.INTER_PLN); assertWithMessage("/[-TUV&&-UA]+/ matched `-UUU-`") .that(scanner.yylex()) .isEqualTo(State.INTER_TUV_UA); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[-TUV&&VA]+/ matched `VVV`") .that(scanner.yylex()) .isEqualTo(State.INTER_TUV_AV); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[VW&&-WA]+/ matched `WWW`") .that(scanner.yylex()) .isEqualTo(State.INTER_VW_WA); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[XXX&&XYZ]+/ matched `XXX`") .that(scanner.yylex()) .isEqualTo(State.INTER_XXX_XYZ); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-AYZ&&-YBM]]+/ matched `-YYY-`") .that(scanner.yylex()) .isEqualTo(State.INTER_AYZ_YMB); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-ZR&&ABZ]]+/ matched `ZZZ`") .that(scanner.yylex()) .isEqualTo(State.INTER_ZR_ABZ); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); } @Test public void symetricDifference() throws Exception { scanner = createScanner( "-,,,-\n" + "-!!!-\n" + "&+&+&\n" + "-//..-\n" + "(-(((-)\n" + "[-[[[-]\n" + "!$```$!\n" + "-_!_||_!_-\n" + "<-@@@->\n" + "{-\\\\\\-}\n" + "/??\";\"??/\n"); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^,.:&&-*(),]]+/ matched `,,,`") .that(scanner.yylex()) .isEqualTo(State.INTER_PUNCTUATION1); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^!&#&&\\^~!]]+/ matched `!!!`") .that(scanner.yylex()) .isEqualTo(State.INTER_PUNCTUATION2); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[[\\p{L}||+]~~[\\p{L}||&]]+/ matched `&+&+&`") .that(scanner.yylex()) .isEqualTo(State.SYM_1); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[-.~~-/]+/ matched `//..`").that(scanner.yylex()).isEqualTo(State.SYM_2); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[-()~~)]+/ matched `(-(((-`").that(scanner.yylex()).isEqualTo(State.SYM_3); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[\\[\\]~~\\[-]+/ matched `-]`") .that(scanner.yylex()) .isEqualTo(State.SYM_4); assertWithMessage("/[^[^!&#&&\\^~!]]+/ matched `!`") .that(scanner.yylex()) .isEqualTo(State.INTER_PUNCTUATION2); assertWithMessage("/[#!~~!#`$]+/ matched `$```$`").that(scanner.yylex()).isEqualTo(State.SYM_5); assertWithMessage("/[^[^!&#&&\\^~!]]+/ matched `!`") .that(scanner.yylex()) .isEqualTo(State.INTER_PUNCTUATION2); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-=%_|~~-%=!]]+/ matched `_!_||_!_`") .that(scanner.yylex()) .isEqualTo(State.SYM_6); assertWithMessage("/[^[^-KO--O]]+/ matched `-`").that(scanner.yylex()).isEqualTo(State.NOT_KOO); assertWithMessage("/[^[^-<>~~<@>]]+/ matched `-@@@-`") .that(scanner.yylex()) .isEqualTo(State.SYM_7); assertWithMessage("/[^[^{}~~-{\\\\}]]+/ matched `-\\\\\\-`") .that(scanner.yylex()) .isEqualTo(State.SYM_8); assertWithMessage("/[-.~~-/]+/ matched `/`").that(scanner.yylex()).isEqualTo(State.SYM_2); assertWithMessage("/[^[^;?/~~\"?/]]+/ matched `\";\"`") .that(scanner.yylex()) .isEqualTo(State.SYM_9); assertWithMessage("/[-.~~-/]+/ matched `/`").that(scanner.yylex()).isEqualTo(State.SYM_2); } private static CharclassScanner createScanner(String content) throws IOException { return new CharclassScanner(CharSource.wrap(content).openStream()); } }