package nl.uva.softwcons.qls.ast; import static nl.uva.softwcons.ql.ast.type.BooleanType.BOOLEAN_TYPE; import static org.assertj.core.api.Assertions.assertThat; import nl.uva.softwcons.generated.QLSLexer; import nl.uva.softwcons.generated.QLSParser; import nl.uva.softwcons.helper.TestHelper; import nl.uva.softwcons.ql.ast.type.BooleanType; import nl.uva.softwcons.qls.ast.segment.Page; import nl.uva.softwcons.qls.ast.segment.Question; import nl.uva.softwcons.qls.ast.segment.Section; import nl.uva.softwcons.qls.ast.stylesheet.Stylesheet; import nl.uva.softwcons.qls.ast.widgetstyle.StyledWidget; import nl.uva.softwcons.qls.ast.widgetstyle.type.DropdownType; import nl.uva.softwcons.qls.ast.widgetstyle.type.RadioButtonType; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; import org.junit.Before; import org.junit.Test; public class ASTBuilderVisitorTest { Stylesheet withPages; Stylesheet withSections; Stylesheet mixedQuestionRegion; Stylesheet withStyleForPage; Stylesheet withStylesForSection; Stylesheet withStylesForQuestions; @Before public void buildStyleSheets() { withPages = build(TestHelper.buildStylesheet("withPages", "page page1 { question q1 }", "page page2 { question q2 }")); withSections = build(TestHelper.buildStylesheet("withSections", "page page1 { section \"s1\" { question q1 } }", "page page2 { section \"s2\" { section \"s3\" { question q2 } } }")); mixedQuestionRegion = build(TestHelper.buildStylesheet("mixedQuestionRegion", "page page1 { question q1 section \"s1\" { question q2 } }", "page page2 { section \"s2\" { section \"s3\" { question q3 } } }")); withStyleForPage = build(TestHelper.buildStylesheet("s1", "page p1 { question q1 default boolean widget dropdown(\"True\", \"False\") { \"width\": 2 } }")); withStylesForSection = build(TestHelper.buildStylesheet("withStylesForSection", "page p1 { section \"s1\" { question q2 default boolean widget dropdown(\"True\", \"False\") } }")); withStylesForQuestions = build(TestHelper.buildStylesheet("withStylesForQuestions", "page p1 { question q1 \n widget radio(\"True\", \"False\")\n" + " question q2 \n widget dropdown(\"Yes\", \"No\") \n }")); } @Test public void testLabelOfStylesheet() { assertThat(withPages.getId().getName()).isEqualTo("withPages"); } @Test public void testPagesClass() { assertThat(withPages.getPages().get(0)).isExactlyInstanceOf(Page.class); assertThat(withPages.getPages().get(0)).isExactlyInstanceOf(Page.class); } @Test public void testPagesCount() { assertThat(withPages.getPages().size()).isEqualTo(2); } @Test public void testPagesId() { Page page1 = withPages.getPages().get(0); Page page2 = withPages.getPages().get(1); assertThat(page1.getId().getName()).isEqualTo("page1"); assertThat(page2.getId().getName()).isEqualTo("page2"); } @Test public void testQuestionClassInPage() { Page page1 = withPages.getPages().get(0); Page page2 = withPages.getPages().get(1); assertThat(page1.getSegments().get(0)).isExactlyInstanceOf(Question.class); assertThat(page2.getSegments().get(0)).isExactlyInstanceOf(Question.class); } @Test public void testQuestionRegionsCountInPages() { Page page1 = withSections.getPages().get(0); Page page2 = withSections.getPages().get(1); assertThat(page1.getSegments().size()).isEqualTo(1); assertThat(page2.getSegments().size()).isEqualTo(1); } @Test public void testSectionsClass() { Page page1 = withSections.getPages().get(0); Page page2 = withSections.getPages().get(1); assertThat(page1.getSegments().get(0)).isExactlyInstanceOf(Section.class); assertThat(page2.getSegments().get(0)).isExactlyInstanceOf(Section.class); } @Test public void testSectionLabel() { Page page1 = withSections.getPages().get(0); Page page2 = withSections.getPages().get(1); Section section1 = (Section) page1.getSegments().get(0); Section section2 = (Section) page2.getSegments().get(0); assertThat(section1.getLabel()).isEqualTo("s1"); assertThat(section2.getLabel()).isEqualTo("s2"); } @Test public void testQuestionsCountInSections() { Page page1 = withSections.getPages().get(0); Page page2 = withSections.getPages().get(1); Section section1 = (Section) page1.getSegments().get(0); Section section2 = (Section) page2.getSegments().get(0); assertThat(section1.getContent().size()).isEqualTo(1); assertThat(section2.getContent().size()).isEqualTo(1); } @Test public void testMixedQuestionRegionInPageSize() { Page page1 = mixedQuestionRegion.getPages().get(0); Page page2 = mixedQuestionRegion.getPages().get(1); assertThat(page1.getSegments().size()).isEqualTo(2); assertThat(page2.getSegments().size()).isEqualTo(1); } @Test public void testMixedQuestionRegionInPageTypes() { Page page1 = mixedQuestionRegion.getPages().get(0); Page page2 = mixedQuestionRegion.getPages().get(1); assertThat(page1.getSegments().get(0)).isExactlyInstanceOf(Question.class); assertThat(page1.getSegments().get(1)).isExactlyInstanceOf(Section.class); assertThat(page2.getSegments().get(0)).isExactlyInstanceOf(Section.class); } @Test public void testMixedQuestionRegionQuestionId() { Page page1 = mixedQuestionRegion.getPages().get(0); Question q = (Question) page1.getSegments().get(0); assertThat(q.getId().getName()).isEqualTo("q1"); } @Test public void testStyleInPageCount() { Page page1 = withStyleForPage.getPages().get(0); assertThat(page1.getStyles().size()).isEqualTo(1); } @Test public void testDefaultStyleQuestionType() { Page page1 = withStyleForPage.getPages().get(0); assertThat(page1.getStyles().keySet()).hasSize(1); assertThat(page1.getStyles().keySet()).extracting("class").contains(BooleanType.class); } @Test public void testDefaultStyleWidgetType() { Page page1 = withStyleForPage.getPages().get(0); assertThat(page1.getStyles().keySet()).hasSize(1); assertThat(page1.getStyles().keySet()).extracting("class").contains(BooleanType.class); } @Test public void testDefaultStyleWidgetStyleExistance() { Page page1 = withStyleForPage.getPages().get(0); StyledWidget widget = page1.getStyles().get(BooleanType.BOOLEAN_TYPE); assertThat(widget.getWidgetStyle()).isNotNull(); } @Test public void testDefaultStyleSectionQuestionType() { Section section = (Section) withStylesForSection.getPages().get(0).getSegments().get(0); assertThat(section.getStyles().keySet()).hasSize(1); assertThat(section.getStyles().keySet()).extracting("class").contains(BooleanType.class); } @Test public void testDefaultStyleSectionWidgetType() { Section section = (Section) withStylesForSection.getPages().get(0).getSegments().get(0); assertThat(section.getStyles().keySet()).hasSize(1); assertThat(section.getStyles().keySet()).extracting("class").contains(BooleanType.class); } @Test public void testWidgetStyleInSectionExistance() { Section section = (Section) withStylesForSection.getPages().get(0).getSegments().get(0); StyledWidget widget = section.getStyles().get(BOOLEAN_TYPE); assertThat(widget.getWidgetStyle()).isNotNull(); } @Test public void testStyleVisibleOnlyInSection() { Page page1 = withStylesForSection.getPages().get(0); Section section = (Section) page1.getSegments().get(0); assertThat(section.getStyles().size()).isEqualTo(1); assertThat(page1.getStyles().size()).isEqualTo(0); } @Test public void testStylesForQuestionsWidgetType() { Page page1 = withStylesForQuestions.getPages().get(0); Question q1 = (Question) page1.getSegments().get(0); Question q2 = (Question) page1.getSegments().get(1); assertThat(q1.getStyledWidget().getWidgetType().get()).isExactlyInstanceOf(RadioButtonType.class); assertThat(q2.getStyledWidget().getWidgetType().get()).isExactlyInstanceOf(DropdownType.class); } @Test public void testStylesForQuestionsStrings() { Page page1 = withStylesForQuestions.getPages().get(0); Question q1 = (Question) page1.getSegments().get(0); Question q2 = (Question) page1.getSegments().get(1); RadioButtonType rb = (RadioButtonType) q1.getStyledWidget().getWidgetType().get(); DropdownType dd = (DropdownType) q2.getStyledWidget().getWidgetType().get(); assertThat(rb.getYes()).isEqualTo("True"); assertThat(rb.getNo()).isEqualTo("False"); assertThat(dd.getYes()).isEqualTo("Yes"); assertThat(dd.getNo()).isEqualTo("No"); } private Stylesheet build(final String input) { return parseForm(new ANTLRInputStream(input)); } private Stylesheet parseForm(final ANTLRInputStream input) { final QLSLexer lexer = new QLSLexer(input); final QLSParser parser = new QLSParser(new CommonTokenStream(lexer)); final ParseTree tree = parser.stylesheet(); return (Stylesheet) new ASTBuilderQLS().visit(tree); } }