# Copyright (c) 2020-2023 Project CHIP 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.

import("//build_overrides/build.gni")
import("//build_overrides/chip.gni")
import("//build_overrides/nlunit_test.gni")
import("//build_overrides/pigweed.gni")

import("${chip_root}/build/chip/chip_test_suite.gni")

chip_test_suite("tests") {
  output_name = "libSupportTests"

  test_sources = [
    "TestBitMask.cpp",
    "TestBufferReader.cpp",
    "TestBufferWriter.cpp",
    "TestBytesCircularBuffer.cpp",
    "TestBytesToHex.cpp",
    "TestDefer.cpp",
    "TestErrorStr.cpp",
    "TestFixedBufferAllocator.cpp",
    "TestFold.cpp",
    "TestIniEscaping.cpp",
    "TestPrivateHeap.cpp",
    "TestSafeInt.cpp",
    "TestSafeString.cpp",
    "TestScoped.cpp",
    "TestScopedBuffer.cpp",
    "TestSorting.cpp",
    "TestSpan.cpp",
    "TestStaticSupportSmartPtr.cpp",
    "TestStringBuilder.cpp",
    "TestStringSplitter.cpp",
    "TestTestPersistentStorageDelegate.cpp",
    "TestTimeUtils.cpp",
    "TestUtf8.cpp",
    "TestVariant.cpp",
  ]
  sources = []

  cflags = [
    "-Wconversion",

    # TODO(#21255): work-around for SimpleStateMachine constructor issue.
    "-Wno-uninitialized",

    # TestStringSplitter intentionally validates string overflows.
    "-Wno-stringop-truncation",
  ]

  public_deps = [
    "${chip_root}/src/credentials",
    "${chip_root}/src/lib/core",
    "${chip_root}/src/lib/support:static-support",
    "${chip_root}/src/lib/support:testing",
    "${chip_root}/src/lib/support/jsontlv",
    "${chip_root}/src/platform",
  ]
}

chip_test_suite_using_nltest("tests_nltest") {
  output_name = "libSupportTestsNL"

  test_sources = [
    "TestCHIPCounter.cpp",
    "TestCHIPMem.cpp",
    "TestCHIPMemString.cpp",
    "TestIntrusiveList.cpp",
    "TestJsonToTlv.cpp",
    "TestJsonToTlvToJson.cpp",
    "TestPersistedCounter.cpp",
    "TestPool.cpp",
    "TestStateMachine.cpp",
    "TestThreadOperationalDataset.cpp",
    "TestTlvJson.cpp",
    "TestTlvToJson.cpp",
    "TestZclString.cpp",
  ]
  sources = []

  if (current_os != "mbed") {
    test_sources += [ "TestCHIPArgParser.cpp" ]
  }

  cflags = [
    "-Wconversion",

    # TODO(#21255): work-around for SimpleStateMachine constructor issue.
    "-Wno-uninitialized",

    # TestStringSplitter intentionally validates string overflows.
    "-Wno-stringop-truncation",
  ]

  public_deps = [
    "${chip_root}/src/credentials",
    "${chip_root}/src/lib/core",
    "${chip_root}/src/lib/support:static-support",
    "${chip_root}/src/lib/support:testing",
    "${chip_root}/src/lib/support:testing_nlunit",
    "${chip_root}/src/lib/support/jsontlv",
    "${chip_root}/src/platform",
    "${nlunit_test_root}:nlunit-test",
  ]
}
