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

if (is_fuchsia) {
  import("//build/fuchsia/sdk.gni")
  import("//flutter/tools/fuchsia/fuchsia_archive.gni")
}
import("//flutter/testing/testing.gni")

source_set("flow") {
  sources = [
    "compositor_context.cc",
    "compositor_context.h",
    "embedded_views.cc",
    "embedded_views.h",
    "instrumentation.cc",
    "instrumentation.h",
    "layers/backdrop_filter_layer.cc",
    "layers/backdrop_filter_layer.h",
    "layers/clip_path_layer.cc",
    "layers/clip_path_layer.h",
    "layers/clip_rect_layer.cc",
    "layers/clip_rect_layer.h",
    "layers/clip_rrect_layer.cc",
    "layers/clip_rrect_layer.h",
    "layers/color_filter_layer.cc",
    "layers/color_filter_layer.h",
    "layers/container_layer.cc",
    "layers/container_layer.h",
    "layers/image_filter_layer.cc",
    "layers/image_filter_layer.h",
    "layers/layer.cc",
    "layers/layer.h",
    "layers/layer_tree.cc",
    "layers/layer_tree.h",
    "layers/opacity_layer.cc",
    "layers/opacity_layer.h",
    "layers/performance_overlay_layer.cc",
    "layers/performance_overlay_layer.h",
    "layers/physical_shape_layer.cc",
    "layers/physical_shape_layer.h",
    "layers/picture_layer.cc",
    "layers/picture_layer.h",
    "layers/platform_view_layer.cc",
    "layers/platform_view_layer.h",
    "layers/shader_mask_layer.cc",
    "layers/shader_mask_layer.h",
    "layers/texture_layer.cc",
    "layers/texture_layer.h",
    "layers/transform_layer.cc",
    "layers/transform_layer.h",
    "matrix_decomposition.cc",
    "matrix_decomposition.h",
    "paint_utils.cc",
    "paint_utils.h",
    "raster_cache.cc",
    "raster_cache.h",
    "raster_cache_key.cc",
    "raster_cache_key.h",
    "skia_gpu_object.cc",
    "skia_gpu_object.h",
    "texture.cc",
    "texture.h",
  ]

  public_configs = [ "//flutter:config" ]

  public_deps = []

  deps = [
    "//flutter/common",
    "//flutter/fml",
    "//third_party/skia",
  ]

  if (is_fuchsia) {
    sources += [
      "layers/child_scene_layer.cc",
      "layers/child_scene_layer.h",
      "scene_update_context.cc",
      "scene_update_context.h",
      "view_holder.cc",
      "view_holder.h",
    ]

    if (using_fuchsia_sdk) {
      public_deps += [
        "$fuchsia_sdk_root/fidl:fuchsia.ui.gfx",
        "$fuchsia_sdk_root/pkg:scenic_cpp",
      ]
    } else {
      public_deps += [
        "//garnet/public/lib/ui/scenic/cpp",
        "//sdk/fidl/fuchsia.ui.scenic",
        "//topaz/public/dart-pkg/zircon",
        "//zircon/public/lib/zx",
      ]
    }
  }
}

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

source_set("flow_testing") {
  testonly = true

  sources = [
    "testing/layer_test.h",
    "testing/mock_layer.cc",
    "testing/mock_layer.h",
    "testing/mock_texture.cc",
    "testing/mock_texture.h",
    "testing/skia_gpu_object_layer_test.cc",
    "testing/skia_gpu_object_layer_test.h",
  ]

  public_deps = [
    ":flow",
    "//flutter/testing:skia",
    "//third_party/googletest:gtest",
  ]
}

executable("flow_unittests") {
  testonly = true

  sources = [
    "flow_run_all_unittests.cc",
    "flow_test_utils.cc",
    "flow_test_utils.h",
    "layers/backdrop_filter_layer_unittests.cc",
    "layers/clip_path_layer_unittests.cc",
    "layers/clip_rect_layer_unittests.cc",
    "layers/clip_rrect_layer_unittests.cc",
    "layers/color_filter_layer_unittests.cc",
    "layers/container_layer_unittests.cc",
    "layers/image_filter_layer_unittests.cc",
    "layers/layer_tree_unittests.cc",
    "layers/opacity_layer_unittests.cc",
    "layers/performance_overlay_layer_unittests.cc",
    "layers/physical_shape_layer_unittests.cc",
    "layers/picture_layer_unittests.cc",
    "layers/platform_view_layer_unittests.cc",
    "layers/shader_mask_layer_unittests.cc",
    "layers/texture_layer_unittests.cc",
    "layers/transform_layer_unittests.cc",
    "matrix_decomposition_unittests.cc",
    "mutators_stack_unittests.cc",
    "raster_cache_unittests.cc",
    "skia_gpu_object_unittests.cc",
    "testing/mock_layer_unittests.cc",
    "testing/mock_texture_unittests.cc",
    "texture_unittests.cc",
  ]

  deps = [
    ":flow",
    ":flow_fixtures",
    ":flow_testing",
    "//flutter/fml",
    "//flutter/testing:skia",
    "//flutter/testing:testing_lib",
    "//third_party/dart/runtime:libdart_jit",  # for tracing
    "//third_party/googletest:gtest",
    "//third_party/skia",
  ]
}

if (is_fuchsia) {
  fuchsia_archive("flow_tests") {
    testonly = true

    deps = [
      ":flow_unittests",
    ]

    binary = "flow_unittests"

    libraries = common_libs

    meta_dir = "//flutter/testing/fuchsia/meta"
    cmx_file = "$meta_dir/fuchsia_test.cmx"

    resources = [
      {
        path = rebase_path(
                "//flutter/testing/resources/performance_overlay_gold_60fps.png")
        dest = "flutter/testing/resources/performance_overlay_gold_60fps.png"
      },
      {
        path = rebase_path(
                "//flutter/testing/resources/performance_overlay_gold_90fps.png")
        dest = "flutter/testing/resources/performance_overlay_gold_90fps.png"
      },
      {
        path = rebase_path(
                "//flutter/testing/resources/performance_overlay_gold_120fps.png")
        dest = "flutter/testing/resources/performance_overlay_gold_120fps.png"
      },
    ]
  }
}
