// Copyright 2020 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.

// This is test verifies that the logging backend:
//
// - Compiles as plain C
// - Runs when compiled as C
//
// Unfortunately, since we do not know where the log sink actually goes, the
// logging functionality itself is not verified beyond compiling and running.

#define PW_LOG_MODULE_NAME "CTS"

#include "pw_log/log.h"

#ifdef __cplusplus
#error "This file must be compiled as plain C to verify C compilation works."
#endif  // __cplusplus

static void LoggingFromFunctionPlainC() { PW_LOG_INFO("From a function!"); }

static void CustomFormatStringTest(void);

void BasicLogTestPlainC() {
  int n = 3;

  // Debug level
  PW_LOG_DEBUG("This log statement should be at DEBUG level; no args");
  for (int i = 0; i < n; ++i) {
    PW_LOG_DEBUG("Counting: %d", i);
  }
  PW_LOG_DEBUG("Here is a string: %s; with another string %s", "foo", "bar");

  // Info level
  PW_LOG_INFO("This log statement should be at INFO level; no args");
  for (int i = 0; i < n; ++i) {
    PW_LOG_INFO("Counting: %d", i);
  }
  PW_LOG_INFO("Here is a string: %s; with another string %s", "foo", "bar");

  // Warn level
  PW_LOG_WARN("This log statement should be at WARN level; no args");
  for (int i = 0; i < n; ++i) {
    PW_LOG_WARN("Counting: %d", i);
  }
  PW_LOG_WARN("Here is a string: %s; with another string %s", "foo", "bar");

  // Error level.
  PW_LOG_ERROR("This log statement should be at ERROR level; no args");
  for (int i = 0; i < n; ++i) {
    PW_LOG_ERROR("Counting: %d", i);
  }
  PW_LOG_ERROR("Here is a string: %s; with another string %s", "foo", "bar");

  // Critical level.
  PW_LOG_CRITICAL("This log is the last one; device should reboot");

  // Core log macro, with manually specified level and flags.
  PW_LOG(PW_LOG_LEVEL_DEBUG, 0, "A manual DEBUG-level message");
  PW_LOG(PW_LOG_LEVEL_DEBUG, 1, "A manual DEBUG-level message; with a flag");

  PW_LOG(PW_LOG_LEVEL_INFO, 0, "A manual INFO-level message");
  PW_LOG(PW_LOG_LEVEL_INFO, 1, "A manual INFO-level message; with a flag");

  PW_LOG(PW_LOG_LEVEL_WARN, 0, "A manual WARN-level message");
  PW_LOG(PW_LOG_LEVEL_WARN, 1, "A manual WARN-level message; with a flag");

  PW_LOG(PW_LOG_LEVEL_ERROR, 0, "A manual ERROR-level message");
  PW_LOG(PW_LOG_LEVEL_ERROR, 1, "A manual ERROR-level message; with a flag");

  PW_LOG(PW_LOG_LEVEL_CRITICAL, 0, "A manual CRITICAL-level message");
  PW_LOG(
      PW_LOG_LEVEL_CRITICAL, 1, "A manual CRITICAL-level message; with a flag");

  // Log levels other than the standard ones work; what each backend does is
  // implementation defined.
  PW_LOG(0, PW_LOG_NO_FLAGS, "Custom log level: 0");
  PW_LOG(1, PW_LOG_NO_FLAGS, "Custom log level: 1");
  PW_LOG(2, PW_LOG_NO_FLAGS, "Custom log level: 2");
  PW_LOG(3, PW_LOG_NO_FLAGS, "Custom log level: 3");
  PW_LOG(100, PW_LOG_NO_FLAGS, "Custom log level: 100");

  // Logging from a function.
  LoggingFromFunctionPlainC();

  // Changing the module name mid-file.
#undef PW_LOG_MODULE_NAME
#define PW_LOG_MODULE_NAME "XYZ"
  PW_LOG_INFO("This has a custom module name");
  PW_LOG_INFO("So does this");

  CustomFormatStringTest();
}

#undef PW_LOG
#define PW_LOG(level, flags, message, ...)                               \
  DoNothingFakeFunction("%d/%d/%d: incoming transmission [" message "]", \
                        level,                                           \
                        __LINE__,                                        \
                        flags PW_COMMA_ARGS(__VA_ARGS__))

static void DoNothingFakeFunction(const char* f, ...) PW_PRINTF_FORMAT(1, 2);

static void DoNothingFakeFunction(const char* f, ...) { (void)f; }

static void CustomFormatStringTest(void) {
  PW_LOG_DEBUG("Abc");
  PW_LOG_INFO("Abc %d", 123);
  PW_LOG_WARN("Abc %d %s", 123, "four");
}
