#include #include #include "DFA/DFAGraph.hpp" #include "NFA/NFAGraph.hpp" #include "converters/NFAToDFA.hpp" using namespace NFA; using namespace DFA; using namespace converters; std::mt19937 rnd(1337); std::string GenerateRandomString(std::vector alphabet, size_t len) { std::string res(len, ' '); for (auto& i: res) { i = alphabet[rnd() % alphabet.size()]; } return res; } TEST(check_equivalence_NFA_to_DFA, 1) { NFA::NFAGraph tree; const int N = 10; int a[N]; for (int i = 0; i < N; ++i) a[i] = tree.AddNewVertex(); tree.GetVertex(a[0])->AddEdge('a', a[1]); tree.GetVertex(a[1])->AddEdge('a', a[2]); tree.GetVertex(a[0])->AddEdge('a', a[3]); tree.GetVertex(a[0])->SetStart(true); tree.GetVertex(a[2])->SetFinal(true); tree.GetVertex(a[3])->SetFinal(true); DFA::DFAGraph res = converters::NFAGraphToDFAGraph(std::move(tree)); EXPECT_FALSE(res.Accepted("")); EXPECT_TRUE(res.Accepted("a")); EXPECT_TRUE(res.Accepted("aa")); EXPECT_FALSE(res.Accepted("aaa")); EXPECT_FALSE(res.Accepted("aaaa")); EXPECT_FALSE(res.Accepted("aaaaa")); EXPECT_FALSE(res.Accepted("b")); } TEST(check_equivalence_NFA_to_DFA, 2) { NFA::NFAGraph tree; const int N = 10; int a[N]; for (int i = 0; i < N; ++i) a[i] = tree.AddNewVertex(); tree.GetVertex(a[0])->AddEdge('a', a[1]); tree.GetVertex(a[0])->AddEdge('a', a[2]); tree.GetVertex(a[1])->AddEdge('b', a[1]); tree.GetVertex(a[2])->AddEdge('c', a[2]); tree.GetVertex(a[0])->SetStart(true); tree.GetVertex(a[1])->SetFinal(true); tree.GetVertex(a[2])->SetFinal(true); DFA::DFAGraph res = converters::NFAGraphToDFAGraph(std::move(tree)); auto check = [](const std::string& str) { if (str.size() > 0) { if (str[0] == 'a') { if (str.size() == 1) { return true; } if (str[1] == 'b') { for (int i = 1; i < str.size(); ++i) { if (str[i] != 'b') { return false; } } return true; } if (str[1] == 'c') { for (int i = 1; i < str.size(); ++i) { if (str[i] != 'c') { return false; } } return true; } } } return false; }; EXPECT_FALSE(res.Accepted("")); EXPECT_TRUE(res.Accepted("a")); EXPECT_FALSE(res.Accepted("aa")); EXPECT_FALSE(res.Accepted("aaa")); EXPECT_FALSE(res.Accepted("aaaa")); EXPECT_FALSE(res.Accepted("aaaaa")); EXPECT_FALSE(res.Accepted("b")); EXPECT_TRUE(res.Accepted("ab")); EXPECT_TRUE(res.Accepted("abb")); EXPECT_TRUE(res.Accepted("ac")); EXPECT_TRUE(res.Accepted("acc")); for (int i = 0; i < 5000; ++i) { auto str = GenerateRandomString({'a', 'b', 'c', 'd'}, 20); ASSERT_EQ(res.Accepted(str), check(str)); } }