blob: 40610e2b963ec46b9e16534938fc371312862a7f [file] [log] [blame]
// Copyright 2019 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.bazel.rules.ninja;
import static com.google.common.truth.Truth.assertThat;
import static java.nio.charset.StandardCharsets.ISO_8859_1;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.devtools.build.lib.bazel.rules.ninja.file.DeclarationAssembler;
import com.google.devtools.build.lib.bazel.rules.ninja.file.FileFragment;
import com.google.devtools.build.lib.bazel.rules.ninja.file.GenericParsingException;
import com.google.devtools.build.lib.util.Pair;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests for {@link DeclarationAssembler}. */
@RunWith(JUnit4.class)
public class DeclarationAssemblerTest {
@Test
public void testAssembleLines() throws GenericParsingException, IOException {
// Glue two parts of the same token together
doSameBufferTest("0123456789", 1, 3, 3, 5, "1234");
// The '\n' symbol happened to be the last in the buffer, we should correctly
// not merge two parts, but create two separate tokens
doSameBufferTest("01\n3456789", 1, 3, 3, 5, "1\n", "34");
// The "\n " sequence does not separate a new token, because of the starting space
doSameBufferTest("01\n 3456789", 1, 4, 4, 6, "1\n 34");
doTwoBuffersTest("abc", "def", "abcdef");
doTwoBuffersTest("abc\n", "def", "abc\n", "def");
doTwoBuffersTest("abc\n", " def", "abc\n def");
doTwoBuffersTest("abc", "\ndef", "abc\n", "def");
doTwoBuffersTest("abc$\n", "def", "abc$\ndef");
doTwoBuffersTest("abc$", "\ndef", "abc$\ndef");
}
@Test
public void testMergeTwoDifferentBuffers() throws Exception {
List<Pair<Long, String>> offsetStringPairList = Lists.newArrayList();
String unrelatedFirstBuffer = Strings.repeat(" ", 100);
String s1 = "hello";
String s2 = "goodbye";
byte[] chars1 = (unrelatedFirstBuffer + s1).getBytes(ISO_8859_1);
ByteBuffer bytes1 = ByteBuffer.wrap(chars1);
byte[] chars2 = s2.getBytes(ISO_8859_1);
ByteBuffer bytes2 = ByteBuffer.wrap(chars2);
DeclarationAssembler assembler =
new DeclarationAssembler(
fragment -> {
offsetStringPairList.add(
new Pair<>(fragment.getFragmentOffset(), fragment.toString()));
});
assembler.wrapUp(
Lists.newArrayList(
new FileFragment(bytes1, 0, unrelatedFirstBuffer.length(), chars1.length),
new FileFragment(bytes2, chars1.length, 0, s2.length())));
assertThat(Iterables.getOnlyElement(offsetStringPairList))
.isEqualTo(new Pair<>((long) unrelatedFirstBuffer.length(), "hellogoodbye"));
}
private static void doTwoBuffersTest(String s1, String s2, String... expected)
throws GenericParsingException, IOException {
List<String> list = Lists.newArrayList();
final byte[] chars1 = s1.getBytes(StandardCharsets.ISO_8859_1);
ByteBuffer bytes1 = ByteBuffer.wrap(chars1);
final byte[] chars2 = s2.getBytes(StandardCharsets.ISO_8859_1);
ByteBuffer bytes2 = ByteBuffer.wrap(chars2);
DeclarationAssembler assembler =
new DeclarationAssembler(
fragment -> {
list.add(fragment.toString());
assertThat(fragment.getFileOffset()).isAnyOf(0L, (long) chars1.length);
});
assembler.wrapUp(
Lists.newArrayList(
new FileFragment(bytes1, 0, 0, s1.length()),
new FileFragment(bytes2, chars1.length, 0, s2.length())));
assertThat(list).isEqualTo(Arrays.asList(expected));
}
private static void doSameBufferTest(
String s, int start1, int end1, int start2, int end2, String... expected)
throws GenericParsingException, IOException {
List<String> list = Lists.newArrayList();
DeclarationAssembler assembler =
new DeclarationAssembler(
fragment -> {
list.add(fragment.toString());
assertThat(fragment.getFileOffset()).isEqualTo(0);
});
byte[] chars = s.getBytes(StandardCharsets.ISO_8859_1);
ByteBuffer bytes = ByteBuffer.wrap(chars);
assembler.wrapUp(
Lists.newArrayList(
new FileFragment(bytes, 0, start1, end1), new FileFragment(bytes, 0, start2, end2)));
assertThat(list).isEqualTo(Arrays.asList(expected));
}
}