public void testAssignClauseRoles() {

    StringSearchFacet.SearchTarget t = StringSearchFacet.SearchTarget.TEXT;
    Boolean caps = true;
    Boolean marks = true;

    try {

      StringSearchFacet.SubClause testTerm =
          testInstance.new SubClause("dummy values", t, caps, marks);
      ArrayList<SearchClause> testClauses = new ArrayList<SearchClause>();

      // single term without antecedent receives default role
      StringSearchFacet.SearchTerm term1 = testInstance.new SearchTerm("kai", t, caps, marks, true);
      testClauses.add(term1);
      testClauses = testTerm.assignClauseRoles(testClauses);
      assertEquals(1, testClauses.get(0).getClauseRoles().size());
      assertEquals(
          StringSearchFacet.ClauseRole.DEFAULT, testClauses.get(0).getClauseRoles().get(0));

      testClauses.clear();

      // term with AND antecedent receives AND role

      term1 = testInstance.new SearchTerm("kai", t, caps, marks, false);
      StringSearchFacet.SearchTerm term2 =
          testInstance.new SearchTerm("AND", t, caps, marks, false);
      StringSearchFacet.SearchTerm term3 =
          testInstance.new SearchTerm("ouk", t, caps, marks, false);
      testClauses.add(term1);
      testClauses.add(term2);
      testClauses.add(term3);
      testClauses = testTerm.assignClauseRoles(testClauses);
      assertEquals(StringSearchFacet.ClauseRole.DEFAULT, term1.getClauseRoles().get(0));
      assertEquals(StringSearchFacet.ClauseRole.AND, term3.getClauseRoles().get(0));

      testClauses.clear();

      // term with OR antecedent or postcedent receives OR role
      term1 = testInstance.new SearchTerm("kai", t, caps, marks, false);
      term2 = testInstance.new SearchTerm("OR", t, caps, marks, false);
      term3 = testInstance.new SearchTerm("ouk", t, caps, marks, false);
      testClauses.add(term1);
      testClauses.add(term2);
      testClauses.add(term3);
      testClauses = testTerm.assignClauseRoles(testClauses);
      assertEquals(StringSearchFacet.ClauseRole.OR, term1.getClauseRoles().get(0));
      assertEquals(StringSearchFacet.ClauseRole.OR, term3.getClauseRoles().get(0));

      testClauses.clear();

      // term with NOT antecedent receives NOT role
      term1 = testInstance.new SearchTerm("NOT", t, caps, marks, false);
      term2 = testInstance.new SearchTerm("ouk", t, caps, marks, false);
      testClauses.add(term1);
      testClauses.add(term2);
      testClauses = testTerm.assignClauseRoles(testClauses);
      assertEquals(StringSearchFacet.ClauseRole.NOT, term2.getClauseRoles().get(0));

      testClauses.clear();

      // term with LEX antecedent receives LEX role
      term1 = testInstance.new SearchTerm("LEX", t, caps, marks, false);
      term2 = testInstance.new SearchTerm("luw", t, caps, marks, false);
      testClauses.add(term1);
      testClauses.add(term2);
      testClauses = testTerm.assignClauseRoles(testClauses);
      assertEquals(StringSearchFacet.ClauseRole.LEMMA, term2.getClauseRoles().get(0));

      testClauses.clear();

      // proximity searches assign pre- and post- roles correctly
      StringSearchFacet.SubClause term6 =
          testInstance.new SubClause("(luw THEN strategos)~15words", t, caps, marks);
      term1 = testInstance.new SearchTerm("luw", t, caps, marks, false);
      term2 = testInstance.new SearchTerm("15w", t, caps, marks, false);
      term3 = testInstance.new SearchTerm("strategos", t, caps, marks, false);
      testClauses.add(term1);
      testClauses.add(term2);
      testClauses.add(term3);
      testClauses = testTerm.assignClauseRoles(testClauses);
      assertEquals(StringSearchFacet.ClauseRole.START_PROX, term1.getClauseRoles().get(0));
      assertEquals(StringSearchFacet.ClauseRole.OPERATOR, term2.getClauseRoles().get(0));
      assertEquals(StringSearchFacet.ClauseRole.END_PROX, term3.getClauseRoles().get(0));

      // mixed handlers add default roles appropriately
      // TODO: These actually work, but for code simplification may not be supported in future
      StringSearchFacet.SubClause term7 =
          testInstance.new SubClause("luw AND ouk OR kai", t, caps, marks);
      ArrayList<StringSearchFacet.SearchClause> subclauses7 = term7.getClauseComponents();
      StringSearchFacet.SearchClause oukAndOrClause = subclauses7.get(2);
      assertEquals(2, oukAndOrClause.getClauseRoles().size());
      assertTrue(oukAndOrClause.getClauseRoles().contains(StringSearchFacet.ClauseRole.AND));
      assertTrue(oukAndOrClause.getClauseRoles().contains(StringSearchFacet.ClauseRole.OR));

      StringSearchFacet.SubClause term8 =
          testInstance.new SubClause("kai THEN LEX luw", t, caps, marks);
      ArrayList<StringSearchFacet.SearchClause> subclauses8 = term8.getClauseComponents();
      StringSearchFacet.SearchClause lemLuwClause = subclauses8.get(3);
      assertEquals(2, lemLuwClause.getClauseRoles().size());
      assertTrue(lemLuwClause.getClauseRoles().contains(StringSearchFacet.ClauseRole.LEMMA));
      assertTrue(lemLuwClause.getClauseRoles().contains(StringSearchFacet.ClauseRole.END_PROX));

    } catch (StringSearchParsingException sspe) {

      fail("StringSearchParsingException erroneously thrown in test: " + sspe.getMessage());
    } catch (Exception e) {

      fail("Exception erroneously thrown in assignClauseRoles test:" + e.getMessage());
    }
  }