# 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_input") {
  public = [
    "text_input_model.h",
  ]

  sources = [
    "text_input_model.cc",
  ]

  configs += [ ":desktop_library_implementation" ]

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

source_set("common_cpp") {
  public = [
    "incoming_message_dispatcher.h",
    "json_message_codec.h",
    "json_method_codec.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",
  ]

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

# 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",
    ":common_cpp_input",
    "//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}}",
  ]
}
