TIMED_TEST(LexiconTests, compareTest_Lexicon, TEST_TIMEOUT_DEFAULT) {
    Lexicon lex;
    lex.add("a");
    lex.add("ab");
    lex.add("bc");
    Lexicon lex2;
    lex2.add("a");
    lex2.add("b");
    lex2.add("c");
    Lexicon lex3;
    compareTestHelper(lex, lex2, "Lexicon", /* compareTo */ -1);
    compareTestHelper(lex2, lex, "Lexicon", /* compareTo */ 1);
    compareTestHelper(lex, lex, "Lexicon", /* compareTo */ 0);

    Set<Lexicon> slex {lex, lex2, lex3};
    assertEqualsString("slex", "{{}, {\"a\", \"ab\", \"bc\"}, {\"a\", \"b\", \"c\"}}", slex.toString());
}
TIMED_TEST(DawgLexiconTests, compareTest_DawgLexicon, TEST_TIMEOUT_DEFAULT) {
    DawgLexicon dawg;
    dawg.add("a");
    dawg.add("b");
    dawg.add("c");
    DawgLexicon dawg2;
    dawg2.add("a");
    dawg2.add("ab");
    dawg2.add("bc");
    DawgLexicon dawg3;
    compareTestHelper(dawg, dawg2, "DawgLexicon", /* compareTo */ 1);
    compareTestHelper(dawg2, dawg, "DawgLexicon", /* compareTo */ -1);
    compareTestHelper(dawg, dawg, "DawgLexicon", /* compareTo */ 0);

    Set<DawgLexicon> sdlex {dawg, dawg2, dawg3};
    assertEqualsString("sdlex", "{{}, {\"a\", \"ab\", \"bc\"}, {\"a\", \"b\", \"c\"}}", sdlex.toString());
}
TIMED_TEST(StackTests, compareTest_Stack, TEST_TIMEOUT_DEFAULT) {
    Stack<int> s1;
    s1.add(1);
    s1.add(2);
    s1.add(1);
    s1.add(5);
    Stack<int> s2;
    s2.add(1);
    s2.add(2);
    s2.add(1);
    s2.add(4);
    s2.add(7);
    compareTestHelper(s1, s2, "Stack", /* compareTo */  1);
    compareTestHelper(s2, s1, "Stack", /* compareTo */ -1);
    compareTestHelper(s1, s1, "Stack", /* compareTo */  0);

    Set<Stack<int> > ss {s1, s2};
    assertEqualsString("ss", "{{1, 2, 1, 4, 7}, {1, 2, 1, 5}}", ss.toString());
}
TIMED_TEST(LinkedHashSetTests, compareTest_LinkedHashSet, TEST_TIMEOUT_DEFAULT) {
    LinkedHashSet<int> set1 {7, 5, 1, 2, 8};
    LinkedHashSet<int> set2 {1, 2, 3, 4};
    LinkedHashSet<int> set3 {2, 1, 3, 4};
    LinkedHashSet<int> set4;
    compareTestHelper(set1, set2, "LinkedHashSet", /* compareTo */  1);
    compareTestHelper(set2, set1, "LinkedHashSet", /* compareTo */ -1);
    compareTestHelper(set1, set3, "LinkedHashSet", /* compareTo */  1);
    compareTestHelper(set2, set3, "LinkedHashSet", /* compareTo */  0);
    compareTestHelper(set3, set2, "LinkedHashSet", /* compareTo */  0);
    compareTestHelper(set2, set4, "LinkedHashSet", /* compareTo */  1);

    // note: shouldn't add set3 because it is 'equal' to set2 (duplicate)
    Set<LinkedHashSet<int> > slhset {set1, set2, set3, set4};
    assertEqualsString("slhset", "{{}, {1, 2, 3, 4}, {7, 5, 1, 2, 8}}", slhset.toString());
}
TIMED_TEST(GridTests, compareTest_Grid, TEST_TIMEOUT_DEFAULT) {
    Grid<int> grid1;
    grid1.resize(2, 2);
    Grid<int> grid2;
    grid2.resize(2, 3);
    Grid<int> grid3;
    grid3.resize(3, 2);
    Grid<int> grid4;

    /* Comparison is lexicographic by rows, then cols, then
     * elements.
     */
    compareTestHelper(grid1, grid2, "Grid", /* compareTo */ -1);
    compareTestHelper(grid2, grid1, "Grid", /* compareTo */  1);
    compareTestHelper(grid1, grid3, "Grid", /* compareTo */ -1);
    compareTestHelper(grid3, grid1, "Grid", /* compareTo */  1);
    compareTestHelper(grid2, grid3, "Grid", /* compareTo */ -1);
    compareTestHelper(grid3, grid2, "Grid", /* compareTo */  1);
    compareTestHelper(grid1, grid1, "Grid", /* compareTo */  0);

    Set<Grid<int>> sgrid {grid1, grid2, grid3, grid4};
    assertEqualsString("sgrid", "{{}, {{0, 0}, {0, 0}}, {{0, 0, 0}, {0, 0, 0}}, {{0, 0}, {0, 0}, {0, 0}}}", sgrid.toString());
}