示例#1
0
TEST_F(TestDFA, Equivalence) {
    instance << "q0";
    instance << "q1";
    instance.addTransition("q0", "q1", 'a');
    instance.accept("q1");

    DFA copy;
    ASSERT_NO_THROW(copy = ~~instance);
    ASSERT_EQ(instance.size(), copy.size());

    DFA almostEqual;
    almostEqual << "q0";
    almostEqual << "q1";
    almostEqual.addTransition("q0", "q1", 'b');
    almostEqual.accept("q1");

    bool r;
    ASSERT_NO_THROW(r = (copy == instance));
    EXPECT_TRUE(r);
    EXPECT_EQ(2, instance.size());
    EXPECT_EQ(2, copy.size());

    ASSERT_NO_THROW(r = (almostEqual == instance));
    EXPECT_FALSE(r);
    EXPECT_EQ(2, instance.size());
    EXPECT_EQ(2, almostEqual.size());
}
示例#2
0
TEST_F(TestDFA, Containment) {
    instance << "q0";
    instance << "q1";
    instance << "q2";
    instance << "q3";
    instance.addTransition("q0", "q1", 'a');
    instance.addTransition("q0", "q1", 'b');
    instance.addTransition("q1", "q2", 'a');
    instance.addTransition("q1", "q2", 'b');
    instance.addTransition("q2", "q3", 'a');
    instance.addTransition("q2", "q3", 'b');
    instance.addTransition("q3", "q0", 'a');
    instance.addTransition("q3", "q0", 'b');
    instance.accept("q0");
    instance.accept("q2");

    DFA second;
    second << "q0";
    second << "q1";
    second.addTransition("q0", "q1", 'a');
    second.addTransition("q1", "q0", 'a');
    second.accept("q0");

    bool r1, r2;
    ASSERT_NO_THROW(r1 = instance.contains(second));
    ASSERT_NO_THROW(r2 = second.contains(instance));

    EXPECT_TRUE(r1);
    EXPECT_FALSE(r2);

    EXPECT_EQ(4, instance.size());
    EXPECT_EQ(2, second.size());
}
示例#3
0
TEST_F(TestDFA, Acceptance) {
    instance << "q0";
    instance << "q1";
    instance << "q2";
    instance.addTransition("q0", "q1", 'a');
    instance.addTransition("q1", "q2", 'b');
    instance.addTransition("q2", "q1", 'b');
    instance.accept("q2");

    instance.read("ab");
    EXPECT_TRUE(instance.accepts());
    instance.reset();
    instance.read("abb");
    EXPECT_FALSE(instance.accepts());

    DFA other;
    other << "q0";
    other.accept("q0");

    EXPECT_TRUE(other.accepts());
    other.read("a");
    EXPECT_FALSE(other.accepts());
    other.reset();
    EXPECT_TRUE(other.accepts());
}
示例#4
0
TEST_F(TestDFA, Union) {
    instance << "q0";
    instance << "q1";
    instance << "q2";
    instance.addTransition("q0", "q1", 'a');
    instance.addTransition("q1", "q2", 'a');
    instance.addTransition("q2", "q0", 'a');
    instance.accept("q0");

    DFA second;
    second << "q0";
    second << "q1";
    second.addTransition("q0", "q1", 'a');
    second.addTransition("q1", "q0", 'a');
    second.accept("q0");

    DFA unionDFA = instance | second;
    EXPECT_EQ(3, instance.size());
    EXPECT_EQ(2, second.size());
    EXPECT_EQ(6, unionDFA.size());
    EXPECT_TRUE(unionDFA.accepts());
    unionDFA.read("a");
    EXPECT_FALSE(unionDFA.accepts());
    unionDFA.read("a");
    EXPECT_TRUE(unionDFA.accepts());
    unionDFA.read("a");
    EXPECT_TRUE(unionDFA.accepts());
    unionDFA.read("a");
    EXPECT_TRUE(unionDFA.accepts());
    unionDFA.read("a");
    EXPECT_FALSE(unionDFA.accepts());
    unionDFA.read("a");
    EXPECT_TRUE(unionDFA.accepts());
}
示例#5
0
TEST_F(TestDFA, Intersection) {
    instance << "q0";
    instance << "q1";
    instance << "q2";
    instance.addTransition("q0", "q1", 'a');
    instance.addTransition("q1", "q2", 'a');
    instance.addTransition("q2", "q0", 'a');
    instance.accept("q0");

    DFA second;
    second << "q0";
    second << "q1";
    second.addTransition("q0", "q1", 'a');
    second.addTransition("q1", "q0", 'a');
    second.accept("q0");

    DFA intersection = instance & second;
    EXPECT_EQ(3, instance.size());
    EXPECT_EQ(2, second.size());
    EXPECT_EQ(6, intersection.size());
    EXPECT_TRUE(intersection.accepts());
    intersection.read("a");
    EXPECT_FALSE(intersection.accepts());
    intersection.read("a");
    EXPECT_FALSE(intersection.accepts());
    intersection.read("a");
    EXPECT_FALSE(intersection.accepts());
    intersection.read("a");
    EXPECT_FALSE(intersection.accepts());
    intersection.read("a");
    EXPECT_FALSE(intersection.accepts());
    intersection.read("a");
    EXPECT_TRUE(intersection.accepts());
}
示例#6
0
TEST_F(TestDFA, RValueOperations) {
    DFA first;
    first << "q0" << "q1" << "q2";
    first.addTransition("q0", "q1", 'a');
    first.addTransition("q1", "q2", 'a');
    first.addTransition("q2", "q0", 'a');
    first.accept("q0");

    DFA second;
    second << "q0" << "q1";
    second.addTransition("q0", "q1", 'a');
    second.addTransition("q1", "q0", 'a');
    second.accept("q1");

    EXPECT_NO_THROW(first & ~second);
    EXPECT_NO_THROW(first | ~second);
    EXPECT_NO_THROW(first == ~second);
    EXPECT_NO_THROW(first.contains(~second));
    EXPECT_NO_THROW(second.contains(~first));
}