# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//flutter/common/config.gni")
import("//flutter/shell/config.gni")
import("testing.gni")

source_set("testing_lib") {
  testonly = true

  sources = [
    "assertions.h",
    "testing.cc",
    "testing.h",
    "thread_test.cc",
    "thread_test.h",
  ]

  public_deps = [
    "//flutter/fml",
    "//third_party/googletest:gmock",
    "//third_party/googletest:gtest",
  ]
  public_configs = [ "//flutter:config" ]
}

source_set("testing") {
  testonly = true

  sources = [
    "debugger_detection.cc",
    "debugger_detection.h",
    "run_all_unittests.cc",
    "test_timeout_listener.cc",
    "test_timeout_listener.h",
  ]

  public_deps = [
    ":testing_lib",
  ]
}

source_set_maybe_fuchsia_legacy("dart") {
  testonly = true

  sources = [
    "dart_isolate_runner.cc",
    "dart_isolate_runner.h",
    "elf_loader.cc",
    "elf_loader.h",
    "test_dart_native_resolver.cc",
    "test_dart_native_resolver.h",
  ]

  public_deps = [
    ":testing_lib",
    "//flutter/common",
    "//flutter/runtime:libdart",
    "//flutter/third_party/tonic",
    "//third_party/dart/runtime/bin:elf_loader",
    "//third_party/skia",
  ]

  public_deps_legacy_and_next = [ "//flutter/runtime:runtime" ]
}

source_set("skia") {
  testonly = true

  sources = [
    "assertions_skia.cc",
    "assertions_skia.h",
    "canvas_test.h",
    "mock_canvas.cc",
    "mock_canvas.h",
  ]

  public_deps = [
    ":testing_lib",
    "//third_party/skia",
  ]
}

source_set_maybe_fuchsia_legacy("fixture_test") {
  testonly = true

  sources = [
    "fixture_test.cc",
    "fixture_test.h",
  ]

  public_deps = [
    "//flutter/common",
  ]

  public_deps_legacy_and_next = [
    ":dart",
    "//flutter/runtime:runtime",
  ]
}

if (enable_unittests) {
  source_set("vulkan") {
    testonly = true

    deps = [
      ":skia",
      "//flutter/fml",
    ]

    # SwiftShader only supports x86/x64_64
    if (target_cpu == "x86" || target_cpu == "x64") {
      configs += [ "//third_party/swiftshader_flutter:swiftshader_config" ]
      deps += [ "//third_party/swiftshader_flutter:swiftshader_vulkan" ]
    }
  }

  # SwiftShader only supports x86/x64_64
  if (target_cpu == "x86" || target_cpu == "x64") {
    source_set("opengl") {
      testonly = true

      configs += [ "//third_party/swiftshader_flutter:swiftshader_config" ]

      sources = [
        "test_gl_surface.cc",
        "test_gl_surface.h",
      ]

      deps = [
        ":skia",
        "//flutter/fml",
        "//third_party/swiftshader_flutter:swiftshader_gl",
      ]
    }

    # All targets on all platforms should be able to use the Metal utilities. On
    # platforms where Metal is not available, the tests must be skipped or
    # implemented to use another available client rendering API. This is usually
    # either OpenGL which is portably implemented via SwiftShader or the software
    # backend. This way, all tests compile on all platforms but the Metal backend
    # is exercised on platforms where Metal itself is available.
    source_set("metal") {
      testonly = true

      sources = [
        "test_metal_surface.cc",
        "test_metal_surface.h",
      ]

      defines = []

      if (shell_enable_metal) {
        sources += [ "test_metal_surface_impl.mm" ]
        defines += [ "TESTING_ENABLE_METAL" ]
      }

      deps = [
        ":skia",
        "//flutter/fml",
      ]
    }

    test_fixtures("testing_fixtures") {
      fixtures = []
    }

    # The //flutter/testing library provides utility methods to other test targets.
    # This test target tests the testing utilities.
    executable("testing_unittests") {
      testonly = true

      sources = [
        "mock_canvas_unittests.cc",
        "test_metal_surface_unittests.cc",
      ]

      deps = [
        ":dart",
        ":metal",
        ":opengl",
        ":skia",
        ":testing",
        ":testing_fixtures",
        ":testing_lib",
      ]
    }
  }
}
