aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Klaus Aehlig <aehlig@google.com>2016-04-15 12:38:21 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-04-15 14:08:52 +0000
commitbf8d910e4bc993e33d747ce4e9dd3f8498734c53 (patch)
treeabe4bb352cf3bb86d2476363e0b2d7b900fca69d /src
parent4321b677c0846e905702ff8fd1a38c00404b675f (diff)
Add a position-aware wrapper around AnsiTerminalWriter
When generating output targeted for a specific terminal width, it is important to know the current position in order to appropriately shorten the message still to be added to the current line. So make it possible to add this functionality to the terminal writer itself, to avoid too many lengthy position computations at call site. -- Change-Id: I03400b9544c32567fc6ea7ab35e742c4ccd7b610 Reviewed-on: https://bazel-review.googlesource.com/#/c/3373 MOS_MIGRATED_REVID=119946982
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriter.java80
-rw-r--r--src/test/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriterTest.java118
2 files changed, 198 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriter.java b/src/main/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriter.java
new file mode 100644
index 0000000000..5a932d4d6d
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriter.java
@@ -0,0 +1,80 @@
+// Copyright 2016 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.util.io;
+
+import java.io.IOException;
+
+/**
+ * Wrap an {@link AnsiTerminalWriter} into one that is aware of the position
+ * within the current line. Newline characters, which presumably are supposed
+ * to end a line, are translated into calls to the {@link AnsiTerminalWriter#newline()}
+ * method.
+ */
+public class PositionAwareAnsiTerminalWriter implements AnsiTerminalWriter {
+
+ private final AnsiTerminalWriter terminalWriter;
+ private int position;
+
+ public PositionAwareAnsiTerminalWriter(AnsiTerminalWriter terminalWriter) {
+ this.terminalWriter = terminalWriter;
+ this.position = 0;
+ }
+
+ private void appendChar(char c) throws IOException {
+ if (c == '\n') {
+ terminalWriter.newline();
+ position = 0;
+ } else {
+ terminalWriter.append(Character.toString(c));
+ position++;
+ }
+ }
+
+ @Override
+ public AnsiTerminalWriter append(String text) throws IOException {
+ for (int i = 0; i < text.length(); i++) {
+ appendChar(text.charAt(i));
+ }
+ return this;
+ }
+
+ @Override
+ public AnsiTerminalWriter newline() throws IOException {
+ terminalWriter.newline();
+ position = 0;
+ return this;
+ }
+
+ @Override
+ public AnsiTerminalWriter okStatus() throws IOException {
+ terminalWriter.okStatus();
+ return this;
+ }
+
+ @Override
+ public AnsiTerminalWriter failStatus() throws IOException {
+ terminalWriter.failStatus();
+ return this;
+ }
+
+ @Override
+ public AnsiTerminalWriter normal() throws IOException {
+ terminalWriter.normal();
+ return this;
+ }
+
+ public int getPosition() {
+ return position;
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriterTest.java b/src/test/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriterTest.java
new file mode 100644
index 0000000000..9de74a038d
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriterTest.java
@@ -0,0 +1,118 @@
+// Copyright 2016 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.util.io;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.devtools.build.lib.testutil.LoggingTerminalWriter;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.io.IOException;
+
+/**
+ * Tests {@link PositionAwareAnsiTerminalWriter}.
+ */
+@RunWith(JUnit4.class)
+public class PositionAwareAnsiTerminalWriterTest {
+ static final String NL = LoggingTerminalWriter.NEWLINE;
+ static final String OK = LoggingTerminalWriter.OK;
+ static final String FAIL = LoggingTerminalWriter.FAIL;
+ static final String NORMAL = LoggingTerminalWriter.NORMAL;
+
+ @Test
+ public void positionSimple() throws IOException {
+ final String sample = "lorem ipsum...";
+ LoggingTerminalWriter loggingTerminalWriter = new LoggingTerminalWriter();
+ PositionAwareAnsiTerminalWriter terminalWriter =
+ new PositionAwareAnsiTerminalWriter(loggingTerminalWriter);
+
+ terminalWriter.append(sample);
+
+ assertEquals(sample.length(), terminalWriter.getPosition());
+ assertEquals(sample, loggingTerminalWriter.getTranscript());
+ }
+
+ @Test
+ public void positionTwoLines() throws IOException {
+ final String firstLine = "lorem ipsum...";
+ final String secondLine = "foo bar baz";
+
+ LoggingTerminalWriter loggingTerminalWriter = new LoggingTerminalWriter();
+ PositionAwareAnsiTerminalWriter terminalWriter =
+ new PositionAwareAnsiTerminalWriter(loggingTerminalWriter);
+
+ terminalWriter.append(firstLine);
+ assertEquals(firstLine.length(), terminalWriter.getPosition());
+ terminalWriter.newline();
+ assertEquals(0, terminalWriter.getPosition());
+ terminalWriter.append(secondLine);
+ assertEquals(secondLine.length(), terminalWriter.getPosition());
+ terminalWriter.newline();
+ assertEquals(0, terminalWriter.getPosition());
+ assertEquals(firstLine + NL + secondLine + NL, loggingTerminalWriter.getTranscript());
+ }
+
+ @Test
+ public void positionNewlineTranslated() throws IOException {
+ final String firstLine = "lorem ipsum...";
+ final String secondLine = "foo bar baz";
+
+ LoggingTerminalWriter loggingTerminalWriter = new LoggingTerminalWriter();
+ PositionAwareAnsiTerminalWriter terminalWriter =
+ new PositionAwareAnsiTerminalWriter(loggingTerminalWriter);
+
+ terminalWriter.append(firstLine + "\n" + secondLine);
+ assertEquals(secondLine.length(), terminalWriter.getPosition());
+ terminalWriter.append("\n");
+ assertEquals(0, terminalWriter.getPosition());
+ assertEquals(firstLine + NL + secondLine + NL, loggingTerminalWriter.getTranscript());
+ }
+
+ @Test
+ public void passThrough() throws IOException {
+ LoggingTerminalWriter loggingTerminalWriter = new LoggingTerminalWriter();
+ PositionAwareAnsiTerminalWriter terminalWriter =
+ new PositionAwareAnsiTerminalWriter(loggingTerminalWriter);
+
+ terminalWriter
+ .append("abc")
+ .okStatus()
+ .append("ok")
+ .failStatus()
+ .append("fail")
+ .normal()
+ .append("normal");
+ assertEquals(
+ "abc" + OK + "ok" + FAIL + "fail" + NORMAL + "normal",
+ loggingTerminalWriter.getTranscript());
+ }
+
+ @Test
+ public void highlightNospace() throws IOException {
+ final String sample = "lorem ipsum...";
+
+ LoggingTerminalWriter loggingTerminalWriter = new LoggingTerminalWriter();
+ PositionAwareAnsiTerminalWriter terminalWriter =
+ new PositionAwareAnsiTerminalWriter(loggingTerminalWriter);
+
+ terminalWriter.failStatus();
+ assertEquals(0, terminalWriter.getPosition());
+ terminalWriter.append(sample);
+ assertEquals(sample.length(), terminalWriter.getPosition());
+ assertEquals(FAIL + sample, loggingTerminalWriter.getTranscript());
+ }
+}