// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/fml/ascii_trie.h"
#include "gtest/gtest.h"

using fml::AsciiTrie;

TEST(AsciiTableTest, Simple) {
  AsciiTrie trie;
  auto entries = std::vector<std::string>{"foo"};
  trie.Fill(entries);
  ASSERT_TRUE(trie.Query("foobar"));
  ASSERT_FALSE(trie.Query("google"));
}

TEST(AsciiTableTest, ExactMatch) {
  AsciiTrie trie;
  auto entries = std::vector<std::string>{"foo"};
  trie.Fill(entries);
  ASSERT_TRUE(trie.Query("foo"));
}

TEST(AsciiTableTest, Empty) {
  AsciiTrie trie;
  ASSERT_TRUE(trie.Query("foo"));
}

TEST(AsciiTableTest, MultipleEntries) {
  AsciiTrie trie;
  auto entries = std::vector<std::string>{"foo", "bar"};
  trie.Fill(entries);
  ASSERT_TRUE(trie.Query("foozzz"));
  ASSERT_TRUE(trie.Query("barzzz"));
}
