// Copyright 2021 The Pigweed 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
//
//     https://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.

#define PW_LOG_MODULE_NAME "log module name!"

// Configure the module so that the test runs against known values.
#undef PW_LOG_TOKENIZED_LEVEL_BITS
#undef PW_LOG_TOKENIZED_MODULE_BITS
#undef PW_LOG_TOKENIZED_FLAG_BITS
#undef PW_LOG_TOKENIZED_LINE_BITS

#define PW_LOG_TOKENIZED_LEVEL_BITS 3
#define PW_LOG_TOKENIZED_MODULE_BITS 16
#define PW_LOG_TOKENIZED_FLAG_BITS 2
#define PW_LOG_TOKENIZED_LINE_BITS 11

#include "pw_log_tokenized/log_tokenized.h"

#include "pw_log_tokenized/base64.h"
#include "pw_log_tokenized/log_tokenized_light.h"
#include "pw_log_tokenized_private/test_utils.h"
#include "pw_unit_test/framework.h"

namespace pw::log_tokenized {
namespace {

TEST(LogTokenized, FormatString_LogModuleName) {
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(
      63, PW_LOG_MODULE_NAME, 1023, "hello %d", 1);
  EXPECT_STREQ(last_log.format_string,
               "■msg♦hello %d■module♦log module name!■file♦" __FILE__);
}

TEST(LogTokenized, FormatString_LogModuleName_NoPayload) {
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER(
      63, PW_LOG_MODULE_NAME, 1023, "hello %d", 1);
  EXPECT_STREQ(last_log.format_string,
               "■msg♦hello %d■module♦log module name!■file♦" __FILE__);
}

TEST(LogTokenized, FormatString_OtherModuleNames) {
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(1, "", 1, "goodbye");
  EXPECT_STREQ(last_log.format_string, "■msg♦goodbye■module♦■file♦" __FILE__);

  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(
      63, "OTHER MODULE!", 123, "goodbye");
  EXPECT_STREQ(last_log.format_string,
               "■msg♦goodbye■module♦OTHER MODULE!■file♦" __FILE__);
}

TEST(LogTokenized, FormatString_OtherModuleNames_NoPayload) {
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER(1, "", 1, "goodbye");
  EXPECT_STREQ(last_log.format_string, "■msg♦goodbye■module♦■file♦" __FILE__);

  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER(63, "OTHER MODULE!", 123, "goodbye");
  EXPECT_STREQ(last_log.format_string,
               "■msg♦goodbye■module♦OTHER MODULE!■file♦" __FILE__);
}

constexpr uintptr_t kModuleToken =
    PW_TOKENIZER_STRING_TOKEN(PW_LOG_MODULE_NAME) &
    ((1u << PW_LOG_TOKENIZED_MODULE_BITS) - 1);

TEST(LogTokenized, Base64) {
  constexpr uint8_t kBinary[6]{1, 2, 3, 4, 5, 6};
  constexpr const char* kBase64Expected = "$AQIDBAUG";  // calculated in Python

  InlineBasicString result_1 = PrefixedBase64Encode(as_bytes(span(kBinary)));
  EXPECT_EQ(result_1, kBase64Expected);
  EXPECT_EQ(result_1.capacity(), kBase64EncodedBufferSizeBytes);

  InlineBasicString result_2 = PrefixedBase64Encode(kBinary, sizeof(kBinary));
  EXPECT_EQ(result_2, kBase64Expected);

  InlineBasicString result_3 = PrefixedBase64Encode(
      reinterpret_cast<const std::byte*>(kBinary), sizeof(kBinary));
  EXPECT_EQ(result_3, kBase64Expected);
}

TEST(LogTokenized, LogMetadata_LevelTooLarge_Clamps) {
  auto check_metadata = [] {
    Metadata metadata = Metadata(last_log.metadata);
    EXPECT_EQ(metadata.level(), 7u);
    EXPECT_EQ(metadata.flags(), 0u);
    EXPECT_EQ(metadata.module(), kModuleToken);
    EXPECT_EQ(metadata.line_number(), 1000u);
  };

  // clang-format off
#line 1000
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(8, PW_LOG_MODULE_NAME, 0, "");
  // clang-format on
  check_metadata();

  pw_log_tokenized_Test_LogMetadata_LevelTooLarge_Clamps();
  check_metadata();
}

TEST(LogTokenized, LogMetadata_TooManyFlags_Truncates) {
  auto check_metadata = [] {
    Metadata metadata = Metadata(last_log.metadata);
    EXPECT_EQ(metadata.level(), 1u);
    EXPECT_EQ(metadata.flags(), 0b11u);
    EXPECT_EQ(metadata.module(), kModuleToken);
    EXPECT_EQ(metadata.line_number(), 1100u);
  };

  // Keep statements on a single line, since GCC and Clang disagree about which
  // line number to assign to multi-line macros.
  // clang-format off
#line 1100
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(1, PW_LOG_MODULE_NAME, 0xFFFFFFFF, "hello");
  // clang-format on
  check_metadata();

  pw_log_tokenized_Test_LogMetadata_TooManyFlags_Truncates();
  check_metadata();
}

TEST(LogTokenized, LogMetadata_VariousValues) {
  auto check_metadata = [] {
    Metadata metadata = Metadata(last_log.metadata);
    EXPECT_EQ(metadata.level(), 6u);
    EXPECT_EQ(metadata.flags(), 3u);
    EXPECT_EQ(metadata.module(), kModuleToken);
    EXPECT_EQ(last_log.arg_count, 1u);
    EXPECT_EQ(metadata.line_number(), 1200u);
  };

  // clang-format off
#line 1200
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(6, PW_LOG_MODULE_NAME, 3, "hello%s", "?");
  // clang-format on
  check_metadata();

  pw_log_tokenized_Test_LogMetadata_LogMetadata_VariousValues();
  check_metadata();
}

TEST(LogTokenized, LogMetadata_Zero) {
  auto check_metadata = [] {
    Metadata metadata = Metadata(last_log.metadata);
    EXPECT_EQ(metadata.level(), 0u);
    EXPECT_EQ(metadata.flags(), 0u);
    EXPECT_EQ(metadata.module(), kModuleToken);
    EXPECT_EQ(last_log.arg_count, 0u);
    EXPECT_EQ(metadata.line_number(), 1300u);
  };

  // clang-format off
#line 1300
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(0, PW_LOG_MODULE_NAME, 0, "");
  // clang-format on
  check_metadata();

  pw_log_tokenized_Test_LogMetadata_LogMetadata_Zero();
  check_metadata();
}

TEST(LogTokenized, LogMetadata_NoPayload) {
  auto check_metadata = [] {
    EXPECT_EQ(last_log.metadata, 0u);
    EXPECT_EQ(last_log.arg_count, 1u);
  };

  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER(6, PW_LOG_MODULE_NAME, 3, "hello%s", "?");
  check_metadata();

  pw_log_tokenized_Test_LogMetadata_NoPayload();
  check_metadata();
}

TEST(LogTokenized, LogMetadata_MaxValues) {
#line 2047
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(7, "name", 3, "hello %d", 1);

  Metadata metadata = Metadata(last_log.metadata);
  EXPECT_EQ(metadata.line_number(), 2047u);
  EXPECT_EQ(metadata.level(), 7u);
  EXPECT_EQ(metadata.flags(), 3u);
  EXPECT_EQ(metadata.module(),
            PW_TOKENIZER_STRING_TOKEN("name") &
                ((1u << PW_LOG_TOKENIZED_MODULE_BITS) - 1));
  EXPECT_EQ(last_log.arg_count, 1u);
}

TEST(LogTokenized, LogMetadata_LineNumberTooLarge_IsZero) {
#line 2048  // At 11 bits, the largest representable line is 2047
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(
      7, PW_LOG_MODULE_NAME, 3, "hello %d", 1);
  EXPECT_EQ(Metadata(last_log.metadata).line_number(), 0u);

#line 2049
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(
      7, PW_LOG_MODULE_NAME, 3, "hello %d", 1);
  EXPECT_EQ(Metadata(last_log.metadata).line_number(), 0u);

#line 99999
  PW_LOG_TOKENIZED_TO_GLOBAL_HANDLER_WITH_METADATA(
      7, PW_LOG_MODULE_NAME, 3, "hello %d", 1);
  EXPECT_EQ(Metadata(last_log.metadata).line_number(), 0u);
}

}  // namespace
}  // namespace pw::log_tokenized
