# 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/impeller/tools/impeller.gni")

impeller_component("golden_playground_test") {
  testonly = true

  sources = [ "golden_playground_test.h" ]

  deps = [
    ":digest",
    "//flutter/fml",
    "//flutter/impeller/aiks",
    "//flutter/impeller/playground",
    "//flutter/impeller/typographer/backends/skia:typographer_skia_backend",
    "//flutter/testing:testing_lib",
  ]

  if (is_mac) {
    sources += [ "golden_playground_test_mac.cc" ]
    deps += [ ":metal_screenshot" ]
  } else {
    sources += [ "golden_playground_test_stub.cc" ]
  }
}

impeller_component("digest") {
  testonly = true

  sources = [
    "golden_digest.cc",
    "golden_digest.h",
    "working_directory.cc",
    "working_directory.h",
  ]

  deps = [ "//flutter/fml" ]
}

if (is_mac) {
  impeller_component("metal_screenshot") {
    testonly = true

    sources = [
      "metal_screenshot.h",
      "metal_screenshot.mm",
      "metal_screenshoter.h",
      "metal_screenshoter.mm",
    ]

    deps = [
      "//flutter/impeller/aiks",
      "//flutter/impeller/playground",
      "//flutter/impeller/renderer/backend/metal:metal",
    ]
  }

  impeller_component("impeller_golden_tests") {
    target_type = "executable"

    testonly = true

    sources = [
      "golden_tests.cc",
      "main.cc",
    ]

    deps = [
      ":digest",
      ":metal_screenshot",
      "//flutter/impeller/aiks",
      "//flutter/impeller/aiks:aiks_unittests_golden",
      "//flutter/impeller/fixtures",
      "//third_party/googletest:gtest",
      "//third_party/swiftshader",
    ]
  }
}
