# 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",
    "gl_context_switch.cc",
    "gl_context_switch.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",
    "surface.cc",
    "surface.h",
    "surface_frame.cc",
    "surface_frame.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/gl_context_switch_test.cc",
    "testing/gl_context_switch_test.h",
    "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",
    "gl_context_switch_unittests.cc",
    "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"
      },
    ]
  }
}
