# 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.

include($ENV{PW_ROOT}/pw_build/pigweed.cmake)

pw_add_module_config(pw_unit_test_CONFIG)

pw_add_library(pw_unit_test.config INTERFACE
  HEADERS
    public/pw_unit_test/config.h
  PUBLIC_INCLUDES
    public
  PUBLIC_DEPS
    ${pw_unit_test_CONFIG}
    pw_polyfill
)

add_library(pw_unit_test INTERFACE)
target_include_directories(pw_unit_test
  INTERFACE
    public
)

# Temporarily redirect deprecated googletest pointer to new pointer.
if("${pw_unit_test_GOOGLETEST_BACKEND}" STREQUAL "pw_third_party.googletest")
  message(DEPRECATION
    "pw_unit_test_GOOGLETEST_BACKEND is deprecated. Set pw_unit_test_BACKEND "
    "to pw_unit_test.googletest instead."
  )
  target_link_libraries(pw_unit_test
    INTERFACE
      pw_unit_test.googletest
  )
else()
  target_link_libraries(pw_unit_test
    INTERFACE
      "${pw_unit_test_BACKEND}"
  )
endif()

pw_add_library(pw_unit_test.light STATIC
  HEADERS
    light_public_overrides/pw_unit_test/framework_backend.h
  SOURCES
    framework_light.cc
  PUBLIC_DEPS
    pw_bytes.alignment
    pw_polyfill
    pw_preprocessor
    pw_string
    pw_unit_test.config
  PUBLIC_INCLUDES
    light_public_overrides
    public
    public_overrides
)

pw_add_library(pw_unit_test.googletest INTERFACE
  HEADERS
    googletest_public_overrides/pw_unit_test/framework_backend.h
  PUBLIC_INCLUDES
    googletest_public_overrides
  PUBLIC_DEPS
    pw_third_party.googletest
)

pw_add_library(pw_unit_test.googletest_handler_adapter STATIC
  SOURCES
    googletest_handler_adapter.cc
  PUBLIC_DEPS
    pw_unit_test.event_handler
    pw_third_party.googletest
  PUBLIC_INCLUDES
    public
)

pw_add_test(pw_unit_test.framework_test
    SOURCES
      framework_test.cc
    PRIVATE_DEPS
      pw_assert
      pw_status
    GROUPS
      pw_unit_test
  )

if(${pw_unit_test_BACKEND} STREQUAL "pw_unit_test.light")
  pw_add_test(pw_unit_test.framework_light_test
    SOURCES
      framework_light_test.cc
    PRIVATE_DEPS
      pw_string
    GROUPS
      pw_unit_test
  )
endif()

pw_add_library(pw_unit_test.static_library_support STATIC
  HEADERS
    public/pw_unit_test/static_library_support.h
  PUBLIC_INCLUDES
    public
  SOURCES
    static_library_support.cc
  PUBLIC_DEPS
    pw_unit_test.light
)

pw_add_library(pw_unit_test.event_handler INTERFACE
  HEADERS
    public/pw_unit_test/event_handler.h
  PUBLIC_INCLUDES
    public
)

pw_add_library(pw_unit_test.googletest_style_event_handler STATIC
  HEADERS
    public/pw_unit_test/googletest_style_event_handler.h
  PUBLIC_INCLUDES
    public
  PUBLIC_DEPS
    pw_unit_test.event_handler
    pw_preprocessor
  SOURCES
    googletest_style_event_handler.cc
)

if(${pw_unit_test_BACKEND} STREQUAL "pw_unit_test.googletest")
  pw_add_library(pw_unit_test.googletest_test_matchers INTERFACE
    HEADERS
      public/pw_unit_test/googletest_test_matchers.h
    PUBLIC_INCLUDES
      public
    PUBLIC_DEPS
      pw_result
      pw_status
      pw_third_party.googletest
  )
  pw_add_test(pw_unit_test.googletest_test_matchers_test
    SOURCES
      googletest_test_matchers_test.cc
    PRIVATE_DEPS
      pw_unit_test.googletest_test_matchers
    GROUPS
      pw_unit_test
  )
endif()

pw_add_library(pw_unit_test.simple_printing_main STATIC
  SOURCES
    simple_printing_main.cc
    simple_printing_event_handler.cc
  PRIVATE_DEPS
    pw_unit_test
    pw_unit_test.googletest_style_event_handler
    pw_preprocessor
    pw_string
    pw_sys_io
)

pw_add_library(pw_unit_test.logging_event_handler STATIC
  HEADERS
    public/pw_unit_test/logging_event_handler.h
  PUBLIC_INCLUDES
    public
  PUBLIC_DEPS
    pw_log
    pw_unit_test.googletest_style_event_handler
  SOURCES
    logging_event_handler.cc
)

pw_add_library(pw_unit_test.logging_main STATIC
  SOURCES
    logging_main.cc
  PRIVATE_DEPS
    pw_unit_test.logging_event_handler
    pw_unit_test
)

pw_add_library(pw_unit_test.multi_event_handler INTERFACE
  HEADERS
    public/pw_unit_test/multi_event_handler.h
  PUBLIC_INCLUDES
    public
  PUBLIC_DEPS
    pw_unit_test.event_handler
)

pw_add_test(pw_unit_test.multi_event_handler_test
  SOURCES
    multi_event_handler_test.cc
  PRIVATE_DEPS
    pw_unit_test.multi_event_handler
  GROUPS
    pw_unit_test
)

pw_add_library(pw_unit_test.test_record_event_handler INTERFACE
  HEADERS
    public/pw_unit_test/internal/test_record_trie.h
    public/pw_unit_test/test_record_event_handler.h
  PUBLIC_INCLUDES
    public
  PUBLIC_DEPS
    pw_assert
    pw_json.builder
    pw_unit_test.event_handler
)

pw_add_test(pw_unit_test.test_record_event_handler_test
  SOURCES
    test_record_event_handler_test.cc
  PRIVATE_DEPS
    pw_unit_test.test_record_event_handler
  GROUPS
    pw_unit_test
)
