# Copyright 2020 The Fuchsia 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("//build/package.gni")
import("//build/test/test_package.gni")

group("cpp") {
  deps = [ ":inspect_cpp_codelab" ]
}

group("tests") {
  testonly = true
  deps = [
    ":inspect_cpp_codelab_integration_tests",
    ":inspect_cpp_codelab_unittests",
  ]
}

package("inspect_cpp_codelab") {
  deps = [
    "client:bin",
    "fizzbuzz:bin",
    "part_1:bin",
    "part_2:bin",
    "part_3:bin",
    "part_4:bin",
    "part_5:bin",
  ]

  binaries = [
    {
      name = "inspect_cpp_codelab_client"
    },
    {
      name = "inspect_cpp_codelab_fizzbuzz_bin"
    },
    {
      name = "inspect_cpp_codelab_part_1_bin"
    },
    {
      name = "inspect_cpp_codelab_part_2_bin"
    },
    {
      name = "inspect_cpp_codelab_part_3_bin"
    },
    {
      name = "inspect_cpp_codelab_part_4_bin"
    },
    {
      name = "inspect_cpp_codelab_part_5_bin"
    },
  ]

  meta = [
    {
      path = rebase_path("client/meta/inspect_cpp_codelab_client.cmx")
      dest = "inspect_cpp_codelab_client.cmx"
    },
    {
      path = rebase_path("fizzbuzz/meta/inspect_cpp_codelab_fizzbuzz.cmx")
      dest = "inspect_cpp_codelab_fizzbuzz.cmx"
    },
    {
      path = rebase_path("part_1/meta/inspect_cpp_codelab_part_1.cmx")
      dest = "inspect_cpp_codelab_part_1.cmx"
    },
    {
      path = rebase_path("part_2/meta/inspect_cpp_codelab_part_2.cmx")
      dest = "inspect_cpp_codelab_part_2.cmx"
    },
    {
      path = rebase_path("part_3/meta/inspect_cpp_codelab_part_3.cmx")
      dest = "inspect_cpp_codelab_part_3.cmx"
    },
    {
      path = rebase_path("part_4/meta/inspect_cpp_codelab_part_4.cmx")
      dest = "inspect_cpp_codelab_part_4.cmx"
    },
    {
      path = rebase_path("part_5/meta/inspect_cpp_codelab_part_5.cmx")
      dest = "inspect_cpp_codelab_part_5.cmx"
    },
  ]
}

test_package("inspect_cpp_codelab_unittests") {
  deps = [
    "part_1:reverser_unittests_part_1",
    "part_2:reverser_unittests_part_2",
    "part_3:reverser_unittests_part_3",
    "part_4:reverser_unittests_part_4",
    "part_5:reverser_unittests_part_5",
  ]

  tests = [
    {
      name = "reverser_unittests_part_1"
      environments = basic_envs
    },
    {
      name = "reverser_unittests_part_2"
      environments = basic_envs
    },
    {
      name = "reverser_unittests_part_3"
      environments = basic_envs
    },
    {
      name = "reverser_unittests_part_4"
      environments = basic_envs
    },
    {
      name = "reverser_unittests_part_5"
      environments = basic_envs
    },
  ]
}

test_package("inspect_cpp_codelab_integration_tests") {
  deps = [
    # Include the components under test in this package. This ensures
    # that our test is hermetic; we don't have cross-package dependencies.
    "fizzbuzz:bin",
    "part_1:bin",
    "part_1/tests:integration_part_1",
    "part_2:bin",
    "part_2/tests:integration_part_2",
    "part_3:bin",
    "part_3/tests:integration_part_3",
    "part_4:bin",
    "part_4/tests:integration_part_4",
    "part_5:bin",
    "part_5/tests:integration_part_5",
  ]

  binaries = [
    {
      name = "inspect_cpp_codelab_fizzbuzz_bin"
    },
    {
      name = "inspect_cpp_codelab_part_1_bin"
    },
    {
      name = "inspect_cpp_codelab_part_2_bin"
    },
    {
      name = "inspect_cpp_codelab_part_3_bin"
    },
    {
      name = "inspect_cpp_codelab_part_4_bin"
    },
    {
      name = "inspect_cpp_codelab_part_5_bin"
    },
  ]

  tests = [
    {
      name = "integration_part_1"
      environments = basic_envs
    },
    {
      name = "integration_part_2"
      environments = basic_envs
    },
    {
      name = "integration_part_3"
      environments = basic_envs
    },
    {
      name = "integration_part_4"
      environments = basic_envs
    },
    {
      name = "integration_part_5"
      environments = basic_envs
    },
  ]

  meta = [
    {
      path = rebase_path("fizzbuzz/meta/inspect_cpp_codelab_fizzbuzz.cmx")
      dest = "inspect_cpp_codelab_fizzbuzz.cmx"
    },
    {
      path = rebase_path("part_1/meta/inspect_cpp_codelab_part_1.cmx")
      dest = "inspect_cpp_codelab_part_1.cmx"
    },
    {
      path = rebase_path("part_2/meta/inspect_cpp_codelab_part_2.cmx")
      dest = "inspect_cpp_codelab_part_2.cmx"
    },
    {
      path = rebase_path("part_3/meta/inspect_cpp_codelab_part_3.cmx")
      dest = "inspect_cpp_codelab_part_3.cmx"
    },
    {
      path = rebase_path("part_4/meta/inspect_cpp_codelab_part_4.cmx")
      dest = "inspect_cpp_codelab_part_4.cmx"
    },
    {
      path = rebase_path("part_5/meta/inspect_cpp_codelab_part_5.cmx")
      dest = "inspect_cpp_codelab_part_5.cmx"
    },
  ]
}
