# 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 = [
      ":metal",
      ":skia",
      ":testing",
      ":testing_fixtures",
      "//flutter/runtime:libdart",
    ]
  }
}
