# Copyright (c) 2011 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This file is meant to be included into an target to create a unittest that
# invokes a set of no-compile tests.  A no-compile test is a test that asserts
# a particular construct will not compile.
#
# Also see:
#   http://dev.chromium.org/developers/testing/no-compile-tests
#
# To use this, create a gyp target with the following form:
#
# import("//build/nocompile.gni")
# nocompile_test("my_module_nc_unittests") {
#   sources = [
#     'nc_testset_1.nc',
#     'nc_testset_2.nc',
#   ]
# }
#
# The .nc files are C++ files that contain code we wish to assert will not
# compile.  Each individual test case in the file should be put in its own
# #ifdef section.  The expected output should be appended with a C++-style
# comment that has a python list of regular expressions.  This will likely
# be greater than 80-characters. Giving a solid expected output test is
# important so that random compile failures do not cause the test to pass.
#
# Example .nc file:
#
#   #if defined(TEST_NEEDS_SEMICOLON)  // [r"expected ',' or ';' at end of input"]
#
#   int a = 1
#
#   #elif defined(TEST_NEEDS_CAST)  // [r"invalid conversion from 'void*' to 'char*'"]
#
#   void* a = NULL;
#   char* b = a;
#
#   #endif
#
# If we needed disable TEST_NEEDS_SEMICOLON, then change the define to:
#
#   DISABLE_TEST_NEEDS_SEMICOLON
#   TEST_NEEDS_CAST
#
# The lines above are parsed by a regexp so avoid getting creative with the
# formatting or ifdef logic; it will likely just not work.
#
# Implementation notes:
# The .nc files are actually processed by a python script which executes the
# compiler and generates a .cc file that is empty on success, or will have a
# series of #error lines on failure, and a set of trivially passing gunit
# TEST() functions on success. This allows us to fail at the compile step when
# something goes wrong, and know during the unittest run that the test was at
# least processed when things go right.

import("//testing/test.gni")

declare_args() {
  # TODO(crbug.com/105388): make sure no-compile test is not flaky.
  enable_nocompile_tests = is_linux && is_clang && host_cpu == target_cpu
}

if (enable_nocompile_tests) {
  import("//build/config/sysroot.gni")
  template("nocompile_test") {
    nocompile_target = target_name + "_run_nocompile"

    action_foreach(nocompile_target) {
      script = "//tools/nocompile_driver.py"
      sources = invoker.sources

      result_path = "$target_gen_dir/{{source_name_part}}_nc.cc"
      depfile = "${result_path}.d"
      outputs = [
        result_path,
      ]
      sysroot_args = ""
      if (sysroot != "") {
        sysroot_args = " --sysroot " + rebase_path(sysroot, root_build_dir)
      }
      args = [
        "4",  # number of compilers to invoke in parallel.
        "{{source}}",
        "-Wall -Werror -Wfatal-errors " + "-I" +
            rebase_path("//", root_build_dir) + sysroot_args,
        rebase_path(result_path, root_build_dir),
      ]
    }

    test(target_name) {
      deps = invoker.deps + [ ":$nocompile_target" ]
      sources = get_target_outputs(":$nocompile_target")
    }
  }
}
