# 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",
    "rtree.cc",
    "rtree.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",
    ]

    public_deps += [
      "$fuchsia_sdk_root/fidl:fuchsia.ui.app",
      "$fuchsia_sdk_root/fidl:fuchsia.ui.gfx",
      "$fuchsia_sdk_root/pkg:scenic_cpp",
    ]
  }
}

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",
    "rtree_unittests.cc",
    "skia_gpu_object_unittests.cc",
    "testing/mock_layer_unittests.cc",
    "testing/mock_texture_unittests.cc",
    "texture_unittests.cc",
  ]

  if (is_fuchsia) {
    sources += [ "layers/fuchsia_layer_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) {
    deps += [ "//build/fuchsia/pkg:sys_cpp_testing" ]
  }
}

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"
      },
    ]
  }
}
