// Copyright 2019 The Fuchsia 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 "src/developer/shell/parser/text_match.h"

#include <gtest/gtest.h>

#include "src/developer/shell/parser/ast_test.h"

namespace shell::parser {

TEST(TextMatchTest, TokenSingle) {
  const char* kTestString = "bob";

  ParseResult result = Token("bob")(ParseResult(kTestString));
  ASSERT_TRUE(result);
  EXPECT_EQ(3u, result.offset());
  EXPECT_EQ(0u, result.errors());
  EXPECT_EQ("('bob')", result.Reduce<ast::TestNode>().node()->ToString(kTestString));
}

TEST(TextMatchTest, TokenMulti) {
  const char* kTestString = "bobbob";

  ParseResult result = Token("bob")(ParseResult(kTestString));
  ASSERT_TRUE(result);
  EXPECT_EQ(3u, result.offset());
  EXPECT_EQ(0u, result.errors());
  EXPECT_EQ("('bob')", result.Reduce<ast::TestNode>().node()->ToString(kTestString));
}

TEST(TextMatchTest, TokenAmongJunk) {
  const char* kTestString = "##bob#!#bob#";

  ParseResult result = Token("bob")(ParseResult(kTestString));
  ASSERT_FALSE(result);
}

TEST(TextMatchTest, AnyChar) {
  const char* kTestString = "b";

  ParseResult result = AnyChar("abc")(ParseResult(kTestString));
  ASSERT_TRUE(result);
  EXPECT_EQ(1u, result.offset());
  EXPECT_EQ(0u, result.errors());
  EXPECT_EQ("('b')", result.Reduce<ast::TestNode>().node()->ToString(kTestString));
}

TEST(TextMatchTest, AnyCharMulti) {
  const char* kTestString = "bc";

  ParseResult result = AnyChar("abc")(ParseResult(kTestString));
  ASSERT_TRUE(result);
  EXPECT_EQ(1u, result.offset());
  EXPECT_EQ(0u, result.errors());
  EXPECT_EQ("('b')", result.Reduce<ast::TestNode>().node()->ToString(kTestString));
}

TEST(TextMatchTest, AnyCharAmongJunk) {
  const char* kTestString = "##b#!#c#";

  ParseResult result = AnyChar("abc")(ParseResult(kTestString));
  ASSERT_FALSE(result);
}

TEST(TextMatchTest, AnyCharBut) {
  const char* kTestString = "b";

  ParseResult result = AnyCharBut("123#!")(ParseResult(kTestString));
  ASSERT_TRUE(result);
  EXPECT_EQ(1u, result.offset());
  EXPECT_EQ(0u, result.errors());
  EXPECT_EQ("('b')", result.Reduce<ast::TestNode>().node()->ToString(kTestString));
}

TEST(TextMatchTest, AnyCharButMulti) {
  const char* kTestString = "bc";

  ParseResult result = AnyCharBut("123#!")(ParseResult(kTestString));
  ASSERT_TRUE(result);
  EXPECT_EQ(1u, result.offset());
  EXPECT_EQ(0u, result.errors());
  EXPECT_EQ("('b')", result.Reduce<ast::TestNode>().node()->ToString(kTestString));
}

TEST(TextMatchTest, AnyCharButAmongJunk) {
  const char* kTestString = "##b#!#c#";

  ParseResult result = AnyCharBut("123#!")(ParseResult(kTestString));
  ASSERT_FALSE(result);
}

TEST(TextMatchTest, CharGroup) {
  const char* kTestString = "b";

  ParseResult result = CharGroup("a-c")(ParseResult(kTestString));
  ASSERT_TRUE(result);
  EXPECT_EQ(1u, result.offset());
  EXPECT_EQ(0u, result.errors());
  EXPECT_EQ("('b')", result.Reduce<ast::TestNode>().node()->ToString(kTestString));
}

TEST(TextMatchTest, CharGroupMulti) {
  const char* kTestString = "bc";

  ParseResult result = CharGroup("a-c")(ParseResult(kTestString));
  ASSERT_TRUE(result);
  EXPECT_EQ(1u, result.offset());
  EXPECT_EQ(0u, result.errors());
  EXPECT_EQ("('b')", result.Reduce<ast::TestNode>().node()->ToString(kTestString));
}

TEST(TextMatchTest, CharGroupAmongJunk) {
  const char* kTestString = "##b#!#c#";

  ParseResult result = CharGroup("a-c")(ParseResult(kTestString));
  ASSERT_FALSE(result);
}

}  // namespace shell::parser
