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

config("desktop_library_implementation") {
  defines = [ "FLUTTER_DESKTOP_LIBRARY" ]
}

_public_headers = [
  "public/flutter_export.h",
  "public/flutter_messenger.h",
  "public/flutter_plugin_registrar.h",
]

# Any files that are built by clients (client_wrapper code, library headers for
# implementations using this shared code, etc.) include the public headers
# assuming they are in the include path. This configuration should be added to
# any such code that is also built by GN to make the includes work.
config("relative_flutter_library_headers") {
  include_dirs = [ "public" ]
}

# The headers are a separate source set since the client wrapper is allowed
# to depend on the public headers, but none of the rest of the code.
source_set("common_cpp_library_headers") {
  public = _public_headers

  configs += [ ":desktop_library_implementation" ]
}

source_set("common_cpp") {
  public = [
    "incoming_message_dispatcher.h",
    "json_message_codec.h",
    "json_method_codec.h",
    "text_input_model.h",
  ]

  # TODO: Refactor flutter_glfw.cc to move the implementations corresponding
  # to the _public_headers above into this target.
  sources = [
    "incoming_message_dispatcher.cc",
    "json_message_codec.cc",
    "json_method_codec.cc",
    "text_input_model.cc",
  ]

  configs += [ ":desktop_library_implementation" ]

  deps = [
    ":common_cpp_library_headers",
    "//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper",
    "//flutter/shell/platform/embedder:embedder_with_symbol_prefix",
  ]

  public_deps = [
    ":common_cpp_core",
    "//third_party/rapidjson",
  ]

  if (is_win) {
    # For wstring_conversion. See issue #50053.
    defines = [ "_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING" ]
  }
}

# The portion of common_cpp that has no dependencies on the public/
# headers. This division should be revisited once the Linux GTK
# embedding is futher along and it's clearer how much, if any, shared
# API surface there will be.
source_set("common_cpp_core") {
  public = [
    "path_utils.h",
  ]

  sources = [
    "path_utils.cc",
  ]
}

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

executable("common_cpp_core_unittests") {
  testonly = true

  sources = [
    "path_utils_unittests.cc",
  ]

  deps = [
    ":common_cpp_core",
    ":common_cpp_core_fixtures",
    "//flutter/testing",
    "//third_party/dart/runtime:libdart_jit",
  ]

  public_configs = [ "//flutter:config" ]
}

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

executable("common_cpp_unittests") {
  testonly = true

  sources = [
    "json_message_codec_unittests.cc",
    "json_method_codec_unittests.cc",
    "text_input_model_unittests.cc",
  ]

  deps = [
    ":common_cpp",
    ":common_cpp_fixtures",
    "//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper",
    "//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper_library_stubs",
    "//flutter/testing",
  ]

  public_configs = [ "//flutter:config" ]
}

copy("publish_headers") {
  sources = _public_headers
  outputs = [
    "$root_out_dir/{{source_file_part}}",
  ]
}
