Home | History | Annotate | Download | only in gn
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/strings/string_number_conversions.h"
      6 #include "testing/gtest/include/gtest/gtest.h"
      7 #include "tools/gn/test_with_scope.h"
      8 
      9 TEST(Template, Basic) {
     10   TestWithScope setup;
     11   TestParseInput input(
     12       "template(\"foo\") {\n"
     13       "  print(target_name)\n"
     14       "  print(invoker.bar)\n"
     15       "}\n"
     16       "foo(\"lala\") {\n"
     17       "  bar = 42\n"
     18       "}");
     19   ASSERT_FALSE(input.has_error());
     20 
     21   Err err;
     22   input.parsed()->Execute(setup.scope(), &err);
     23   ASSERT_FALSE(err.has_error()) << err.message();
     24 
     25   EXPECT_EQ("lala\n42\n", setup.print_output());
     26 }
     27 
     28 TEST(Template, UnusedTargetNameShouldThrowError) {
     29   TestWithScope setup;
     30   TestParseInput input(
     31       "template(\"foo\") {\n"
     32       "  print(invoker.bar)\n"
     33       "}\n"
     34       "foo(\"lala\") {\n"
     35       "  bar = 42\n"
     36       "}");
     37   ASSERT_FALSE(input.has_error());
     38 
     39   Err err;
     40   input.parsed()->Execute(setup.scope(), &err);
     41   EXPECT_TRUE(err.has_error());
     42 }
     43 
     44 TEST(Template, UnusedInvokerShouldThrowError) {
     45   TestWithScope setup;
     46   TestParseInput input(
     47       "template(\"foo\") {\n"
     48       "  print(target_name)\n"
     49       "}\n"
     50       "foo(\"lala\") {\n"
     51       "  bar = 42\n"
     52       "}");
     53   ASSERT_FALSE(input.has_error());
     54 
     55   Err err;
     56   input.parsed()->Execute(setup.scope(), &err);
     57   EXPECT_TRUE(err.has_error());
     58 }
     59 
     60 TEST(Template, UnusedVarInInvokerShouldThrowError) {
     61   TestWithScope setup;
     62   TestParseInput input(
     63       "template(\"foo\") {\n"
     64       "  print(target_name)\n"
     65       "  print(invoker.bar)\n"
     66       "}\n"
     67       "foo(\"lala\") {\n"
     68       "  bar = 42\n"
     69       "  baz = [ \"foo\" ]\n"
     70       "}");
     71   ASSERT_FALSE(input.has_error());
     72 
     73   Err err;
     74   input.parsed()->Execute(setup.scope(), &err);
     75   EXPECT_TRUE(err.has_error());
     76 }
     77 
     78 // Previous versions of the template implementation would copy templates by
     79 // value when it makes a closure. Doing a sequence of them means that every new
     80 // one copies all previous ones, which gives a significant blow-up in memory.
     81 // If this test doesn't crash with out-of-memory, it passed.
     82 TEST(Template, MemoryBlowUp) {
     83   TestWithScope setup;
     84   std::string code;
     85   for (int i = 0; i < 100; i++)
     86     code += "template(\"test" + base::IntToString(i) + "\") {}\n";
     87 
     88   TestParseInput input(code);
     89 
     90   Err err;
     91   input.parsed()->Execute(setup.scope(), &err);
     92   ASSERT_FALSE(input.has_error());
     93 }
     94