// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/tint/diagnostic/formatter.h"

#include <utility>

#include "gtest/gtest.h"
#include "src/tint/diagnostic/diagnostic.h"

namespace tint {
namespace diag {
namespace {

Diagnostic Diag(Severity severity,
                Source source,
                std::string message,
                System system,
                const char* code = nullptr) {
  Diagnostic d;
  d.severity = severity;
  d.source = source;
  d.message = std::move(message);
  d.system = system;
  d.code = code;
  return d;
}

constexpr const char* ascii_content =  // Note: words are tab-delimited
    R"(the	cat	says	meow
the	dog	says	woof
the	snake	says	quack
the	snail	says	???
)";

constexpr const char* utf8_content =  // Note: words are tab-delimited
    "the	\xf0\x9f\x90\xb1	says	meow\n"   // NOLINT: tabs
    "the	\xf0\x9f\x90\x95	says	woof\n"   // NOLINT: tabs
    "the	\xf0\x9f\x90\x8d	says	quack\n"  // NOLINT: tabs
    "the	\xf0\x9f\x90\x8c	says	???\n";   // NOLINT: tabs

class DiagFormatterTest : public testing::Test {
 public:
  Source::File ascii_file{"file.name", ascii_content};
  Source::File utf8_file{"file.name", utf8_content};
  Diagnostic ascii_diag_note =
      Diag(Severity::Note,
           Source{Source::Range{Source::Location{1, 14}}, &ascii_file},
           "purr",
           System::Test);
  Diagnostic ascii_diag_warn =
      Diag(Severity::Warning,
           Source{Source::Range{{2, 14}, {2, 18}}, &ascii_file},
           "grrr",
           System::Test);
  Diagnostic ascii_diag_err =
      Diag(Severity::Error,
           Source{Source::Range{{3, 16}, {3, 21}}, &ascii_file},
           "hiss",
           System::Test,
           "abc123");
  Diagnostic ascii_diag_ice =
      Diag(Severity::InternalCompilerError,
           Source{Source::Range{{4, 16}, {4, 19}}, &ascii_file},
           "unreachable",
           System::Test);
  Diagnostic ascii_diag_fatal =
      Diag(Severity::Fatal,
           Source{Source::Range{{4, 16}, {4, 19}}, &ascii_file},
           "nothing",
           System::Test);

  Diagnostic utf8_diag_note =
      Diag(Severity::Note,
           Source{Source::Range{Source::Location{1, 15}}, &utf8_file},
           "purr",
           System::Test);
  Diagnostic utf8_diag_warn =
      Diag(Severity::Warning,
           Source{Source::Range{{2, 15}, {2, 19}}, &utf8_file},
           "grrr",
           System::Test);
  Diagnostic utf8_diag_err =
      Diag(Severity::Error,
           Source{Source::Range{{3, 15}, {3, 20}}, &utf8_file},
           "hiss",
           System::Test,
           "abc123");
  Diagnostic utf8_diag_ice =
      Diag(Severity::InternalCompilerError,
           Source{Source::Range{{4, 15}, {4, 18}}, &utf8_file},
           "unreachable",
           System::Test);
  Diagnostic utf8_diag_fatal =
      Diag(Severity::Fatal,
           Source{Source::Range{{4, 15}, {4, 18}}, &utf8_file},
           "nothing",
           System::Test);
};

TEST_F(DiagFormatterTest, Simple) {
  Formatter fmt{{false, false, false, false}};
  auto got = fmt.format(List{ascii_diag_note, ascii_diag_warn, ascii_diag_err});
  auto* expect = R"(1:14: purr
2:14: grrr
3:16 abc123: hiss)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, SimpleNewlineAtEnd) {
  Formatter fmt{{false, false, false, true}};
  auto got = fmt.format(List{ascii_diag_note, ascii_diag_warn, ascii_diag_err});
  auto* expect = R"(1:14: purr
2:14: grrr
3:16 abc123: hiss
)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, SimpleNoSource) {
  Formatter fmt{{false, false, false, false}};
  auto diag = Diag(Severity::Note, Source{}, "no source!", System::Test);
  auto got = fmt.format(List{diag});
  auto* expect = "no source!";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, WithFile) {
  Formatter fmt{{true, false, false, false}};
  auto got = fmt.format(List{ascii_diag_note, ascii_diag_warn, ascii_diag_err});
  auto* expect = R"(file.name:1:14: purr
file.name:2:14: grrr
file.name:3:16 abc123: hiss)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, WithSeverity) {
  Formatter fmt{{false, true, false, false}};
  auto got = fmt.format(List{ascii_diag_note, ascii_diag_warn, ascii_diag_err});
  auto* expect = R"(1:14 note: purr
2:14 warning: grrr
3:16 error abc123: hiss)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, WithLine) {
  Formatter fmt{{false, false, true, false}};
  auto got = fmt.format(List{ascii_diag_note, ascii_diag_warn, ascii_diag_err});
  auto* expect = R"(1:14: purr
the  cat  says  meow
                ^

2:14: grrr
the  dog  says  woof
                ^^^^

3:16 abc123: hiss
the  snake  says  quack
                  ^^^^^
)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, UnicodeWithLine) {
  Formatter fmt{{false, false, true, false}};
  auto got = fmt.format(List{utf8_diag_note, utf8_diag_warn, utf8_diag_err});
  auto* expect =
      "1:15: purr\n"
      "the  \xf0\x9f\x90\xb1  says  meow\n"
      "\n"
      "2:15: grrr\n"
      "the  \xf0\x9f\x90\x95  says  woof\n"
      "\n"
      "3:15 abc123: hiss\n"
      "the  \xf0\x9f\x90\x8d  says  quack\n";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, BasicWithFileSeverityLine) {
  Formatter fmt{{true, true, true, false}};
  auto got = fmt.format(List{ascii_diag_note, ascii_diag_warn, ascii_diag_err});
  auto* expect = R"(file.name:1:14 note: purr
the  cat  says  meow
                ^

file.name:2:14 warning: grrr
the  dog  says  woof
                ^^^^

file.name:3:16 error abc123: hiss
the  snake  says  quack
                  ^^^^^
)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, BasicWithMultiLine) {
  auto multiline = Diag(Severity::Warning,
                        Source{Source::Range{{2, 9}, {4, 15}}, &ascii_file},
                        "multiline", System::Test);
  Formatter fmt{{false, false, true, false}};
  auto got = fmt.format(List{multiline});
  auto* expect = R"(2:9: multiline
the  dog  says  woof
          ^^^^^^^^^^
the  snake  says  quack
^^^^^^^^^^^^^^^^^^^^^^^
the  snail  says  ???
^^^^^^^^^^^^^^^^
)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, UnicodeWithMultiLine) {
  auto multiline = Diag(Severity::Warning,
                        Source{Source::Range{{2, 9}, {4, 15}}, &utf8_file},
                        "multiline", System::Test);
  Formatter fmt{{false, false, true, false}};
  auto got = fmt.format(List{multiline});
  auto* expect =
      "2:9: multiline\n"
      "the  \xf0\x9f\x90\x95  says  woof\n"
      "the  \xf0\x9f\x90\x8d  says  quack\n"
      "the  \xf0\x9f\x90\x8c  says  ???\n";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, BasicWithFileSeverityLineTab4) {
  Formatter fmt{{true, true, true, false, 4u}};
  auto got = fmt.format(List{ascii_diag_note, ascii_diag_warn, ascii_diag_err});
  auto* expect = R"(file.name:1:14 note: purr
the    cat    says    meow
                      ^

file.name:2:14 warning: grrr
the    dog    says    woof
                      ^^^^

file.name:3:16 error abc123: hiss
the    snake    says    quack
                        ^^^^^
)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, BasicWithMultiLineTab4) {
  auto multiline = Diag(Severity::Warning,
                        Source{Source::Range{{2, 9}, {4, 15}}, &ascii_file},
                        "multiline", System::Test);
  Formatter fmt{{false, false, true, false, 4u}};
  auto got = fmt.format(List{multiline});
  auto* expect = R"(2:9: multiline
the    dog    says    woof
              ^^^^^^^^^^^^
the    snake    says    quack
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
the    snail    says    ???
^^^^^^^^^^^^^^^^^^^^
)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, ICE) {
  Formatter fmt{{}};
  auto got = fmt.format(List{ascii_diag_ice});
  auto* expect = R"(file.name:4:16 internal compiler error: unreachable
the  snail  says  ???
                  ^^^

)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, Fatal) {
  Formatter fmt{{}};
  auto got = fmt.format(List{ascii_diag_fatal});
  auto* expect = R"(file.name:4:16 fatal: nothing
the  snail  says  ???
                  ^^^

)";
  ASSERT_EQ(expect, got);
}

TEST_F(DiagFormatterTest, RangeOOB) {
  Formatter fmt{{true, true, true, true}};
  diag::List list;
  list.add_error(System::Test, "oob",
                 Source{{{10, 20}, {30, 20}}, &ascii_file});
  auto got = fmt.format(list);
  auto* expect = R"(file.name:10:20 error: oob

)";
  ASSERT_EQ(expect, got);
}

}  // namespace
}  // namespace diag
}  // namespace tint
