15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright (c) 2013 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/scope.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "tools/gn/test_with_scope.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Checks that we find unused identifiers in targets.
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(FunctionsTarget, CheckUnused) {
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Scheduler scheduler;
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestWithScope setup;
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The target generator needs a place to put the targets or it will fail.
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Scope::ItemVector item_collector;
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  setup.scope()->set_item_collector(&item_collector);
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Test a good one first.
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestParseInput good_input(
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "source_set(\"foo\") {\n"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "}\n");
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(good_input.has_error());
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Err err;
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  good_input.parsed()->Execute(setup.scope(), &err);
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(err.has_error()) << err.message();
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Test a source set (this covers everything but component) with an unused
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // variable.
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestParseInput source_set_input(
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "source_set(\"foo\") {\n"
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  unused = 5\n"
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "}\n");
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(source_set_input.has_error());
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  err = Err();
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  source_set_input.parsed()->Execute(setup.scope(), &err);
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(err.has_error());
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Test a component, which is a different code path.
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestParseInput component_input(
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "component_mode = \"static_library\"\n"
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "component(\"bar\") {\n"
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  unused = 5\n"
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "}\n");
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(component_input.has_error());
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  err = Err();
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  component_input.parsed()->Execute(setup.scope(), &err);
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(err.has_error()) << err.message();
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
51