blob: 004b767c2cccb49bea19e77564f6b78af26ed0a7 [file] [log] [blame]
// Copyright 2020 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.syntax;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests for StringModule. */
// TODO(bazel-team): Migrate these test cases back to string_misc.sky, once either
// 1) --incompatible_string_replace_count has been flipped (#11244) and deleted, or 2) the
// standalone Starlark interpreter and tests gain the ability to run with semantics flags.
@RunWith(JUnit4.class)
public class StringModuleTest extends EvaluationTestCase {
private void runReplaceTest(String flag) throws Exception {
new Scenario(flag)
.testEval("'banana'.replace('a', 'o')", "'bonono'")
.testEval("'banana'.replace('a', 'o', 2)", "'bonona'")
.testEval("'banana'.replace('a', 'o', 0)", "'banana'")
.testEval("'banana'.replace('a', 'e')", "'benene'")
.testEval("'banana'.replace('a', '$()')", "'b$()n$()n$()'")
.testEval("'banana'.replace('a', '$')", "'b$n$n$'")
.testEval("'b$()n$()n$()'.replace('$()', '$($())')", "'b$($())n$($())n$($())'")
.testEval("'banana'.replace('a', 'e', 2)", "'benena'")
.testEval("'banana'.replace('a', 'e', 0)", "'banana'")
.testEval("'banana'.replace('', '-')", "'-b-a-n-a-n-a-'")
.testEval("'banana'.replace('', '-', 2)", "'-b-anana'")
.testEval("'banana'.replace('', '-', 0)", "'banana'")
.testEval("'banana'.replace('', '')", "'banana'")
.testEval("'banana'.replace('a', '')", "'bnn'")
.testEval("'banana'.replace('a', '', 2)", "'bnna'");
}
@Test
public void testReplaceWithAndWithoutFlag() throws Exception {
runReplaceTest("--incompatible_string_replace_count=false");
runReplaceTest("--incompatible_string_replace_count=true");
}
@Test
public void testReplaceIncompatibleFlag() throws Exception {
// Test the scenario that changes with the incompatible flag
new Scenario("--incompatible_string_replace_count=false")
.testEval("'banana'.replace('a', 'o', -2)", "'banana'")
.testEval("'banana'.replace('a', 'e', -1)", "'banana'")
.testEval("'banana'.replace('a', 'e', -10)", "'banana'")
.testEval("'banana'.replace('', '-', -2)", "'banana'");
new Scenario("--incompatible_string_replace_count=true")
.testEval("'banana'.replace('a', 'o', -2)", "'bonono'")
.testEval("'banana'.replace('a', 'e', -1)", "'benene'")
.testEval("'banana'.replace('a', 'e', -10)", "'benene'")
.testEval("'banana'.replace('', '-', -2)", "'-b-a-n-a-n-a-'");
}
@Test
public void testReplaceNoneCount() throws Exception {
// Passing None as the max number of replacements is disallowed with the incompatible flag.
new Scenario("--incompatible_string_replace_count=false")
.testEval("'banana'.replace('a', 'e', None)", "'benene'");
new Scenario("--incompatible_string_replace_count=true")
.testIfErrorContains("Cannot pass a None count", "'banana'.replace('a', 'e', None)");
}
}