// Copyright 2014 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.
#include "base/strings/string_number_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "tools/gn/test_with_scope.h"
TEST(Template, Basic) {
TestWithScope setup;
TestParseInput input(
"template(\"foo\") {\n"
" print(target_name)\n"
" print(invoker.bar)\n"
"}\n"
"foo(\"lala\") {\n"
" bar = 42\n"
"}");
ASSERT_FALSE(input.has_error());
Err err;
input.parsed()->Execute(setup.scope(), &err);
ASSERT_FALSE(err.has_error()) << err.message();
EXPECT_EQ("lala\n42\n", setup.print_output());
}
TEST(Template, UnusedTargetNameShouldThrowError) {
TestWithScope setup;
TestParseInput input(
"template(\"foo\") {\n"
" print(invoker.bar)\n"
"}\n"
"foo(\"lala\") {\n"
" bar = 42\n"
"}");
ASSERT_FALSE(input.has_error());
Err err;
input.parsed()->Execute(setup.scope(), &err);
EXPECT_TRUE(err.has_error());
}
TEST(Template, UnusedInvokerShouldThrowError) {
TestWithScope setup;
TestParseInput input(
"template(\"foo\") {\n"
" print(target_name)\n"
"}\n"
"foo(\"lala\") {\n"
" bar = 42\n"
"}");
ASSERT_FALSE(input.has_error());
Err err;
input.parsed()->Execute(setup.scope(), &err);
EXPECT_TRUE(err.has_error());
}
TEST(Template, UnusedVarInInvokerShouldThrowError) {
TestWithScope setup;
TestParseInput input(
"template(\"foo\") {\n"
" print(target_name)\n"
" print(invoker.bar)\n"
"}\n"
"foo(\"lala\") {\n"
" bar = 42\n"
" baz = [ \"foo\" ]\n"
"}");
ASSERT_FALSE(input.has_error());
Err err;
input.parsed()->Execute(setup.scope(), &err);
EXPECT_TRUE(err.has_error());
}
// Previous versions of the template implementation would copy templates by
// value when it makes a closure. Doing a sequence of them means that every new
// one copies all previous ones, which gives a significant blow-up in memory.
// If this test doesn't crash with out-of-memory, it passed.
TEST(Template, MemoryBlowUp) {
TestWithScope setup;
std::string code;
for (int i = 0; i < 100; i++)
code += "template(\"test" + base::IntToString(i) + "\") {}\n";
TestParseInput input(code);
Err err;
input.parsed()->Execute(setup.scope(), &err);
ASSERT_FALSE(input.has_error());
}