Home | History | Annotate | Download | only in gn
      1 // Copyright (c) 2013 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 "testing/gtest/include/gtest/gtest.h"
      6 #include "tools/gn/test_with_scope.h"
      7 
      8 TEST(FunctionForeach, CollisionOnLoopVar) {
      9   TestWithScope setup;
     10   TestParseInput input(
     11       "a = 5\n"
     12       "i = 6\n"
     13       "foreach(i, [1, 2, 3]) {\n"  // Use same loop var name previously defined.
     14       "  print(\"$a $i\")\n"
     15       "  a = a + 1\n"  // Test for side effects inside loop.
     16       "}\n"
     17       "print(\"$a $i\")");  // Make sure that i goes back to original value.
     18   ASSERT_FALSE(input.has_error());
     19 
     20   Err err;
     21   input.parsed()->Execute(setup.scope(), &err);
     22   ASSERT_FALSE(err.has_error()) << err.message();
     23 
     24   EXPECT_EQ("5 1\n6 2\n7 3\n8 6\n", setup.print_output());
     25 }
     26 
     27 TEST(FunctionForeach, UniqueLoopVar) {
     28   TestWithScope setup;
     29   TestParseInput input_good(
     30       "foreach(i, [1, 2, 3]) {\n"
     31       "  print(i)\n"
     32       "}\n");
     33   ASSERT_FALSE(input_good.has_error());
     34 
     35   Err err;
     36   input_good.parsed()->Execute(setup.scope(), &err);
     37   ASSERT_FALSE(err.has_error()) << err.message();
     38 
     39   EXPECT_EQ("1\n2\n3\n", setup.print_output());
     40   setup.print_output().clear();
     41 
     42   // Same thing but try to use the loop var after loop is done. It should be
     43   // undefined and throw an error.
     44   TestParseInput input_bad(
     45       "foreach(i, [1, 2, 3]) {\n"
     46       "  print(i)\n"
     47       "}\n"
     48       "print(i)");
     49   ASSERT_FALSE(input_bad.has_error());  // Should parse OK.
     50 
     51   input_bad.parsed()->Execute(setup.scope(), &err);
     52   ASSERT_TRUE(err.has_error());  // Shouldn't actually run.
     53 }
     54