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