15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "tools/gn/scheduler.h"
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "tools/gn/test_with_scope.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Tests that actions can't have output substitutions.
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(ActionTargetGenerator, ActionOutputSubstitutions) {
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Scheduler scheduler;
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestWithScope setup;
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Scope::ItemVector items_;
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  setup.scope()->set_item_collector(&items_);
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // First test one with no substitutions, this should be valid.
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestParseInput input_good(
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "action(\"foo\") {\n"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  script = \"//foo.py\"\n"
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  sources = [ \"//bar.txt\" ]\n"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  outputs = [ \"//out/Debug/one.txt\" ]\n"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "}");
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(input_good.has_error());
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // This should run fine.
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Err err;
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_good.parsed()->Execute(setup.scope(), &err);
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(err.has_error()) << err.message();
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Same thing with a pattern in the output should fail.
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestParseInput input_bad(
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "action(\"foo\") {\n"
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  script = \"//foo.py\"\n"
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  sources = [ \"//bar.txt\" ]\n"
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  outputs = [ \"//out/Debug/{{source_name_part}}.txt\" ]\n"
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "}");
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(input_bad.has_error());
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // This should run fine.
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_bad.parsed()->Execute(setup.scope(), &err);
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(err.has_error());
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
43