1 /*
2  * AnsiCodeTests.java
3  *
4  * Copyright (C) 2021 by RStudio, PBC
5  *
6  * Unless you have received this program directly from RStudio pursuant
7  * to the terms of a commercial license agreement with RStudio, then
8  * this program is licensed to you under the terms of version 3 of the
9  * GNU Affero General Public License. This program is distributed WITHOUT
10  * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
11  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
12  * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
13  *
14  */
15 package org.rstudio.core.client;
16 
17 import org.rstudio.core.client.regex.Match;
18 import org.rstudio.core.client.regex.Pattern;
19 
20 import com.google.gwt.junit.client.GWTTestCase;
21 import junit.framework.Assert;
22 
23 public class AnsiCodeTests extends GWTTestCase
24 {
25    @Override
getModuleName()26    public String getModuleName()
27    {
28       return "org.rstudio.studio.RStudioTests";
29    }
30 
testConsoleControlCharacterParse()31    public void testConsoleControlCharacterParse()
32    {
33       boolean foundLinefeed = false;
34       boolean foundFormfeed = false;
35       boolean foundBackspace = false;
36       boolean foundCarriageReturn = false;
37       boolean foundFirstESCMarker = false;
38       boolean foundSecondESCMarker = false;
39 
40       Pattern ConsoleCtrlPattern = Pattern.create(AnsiCode.CONTROL_REGEX);
41 
42       String data = "A\nBC\fD\7EF\bG\rH\u001bZoom\u009bNoMore]";
43       Match match = ConsoleCtrlPattern.match(data, 0);
44       Assert.assertNotNull(match);
45       while (match != null)
46       {
47          if (match.getValue().compareTo("\n") == 0)
48          {
49             Assert.assertFalse(foundLinefeed);
50             Assert.assertEquals(1, match.getIndex());
51             foundLinefeed = true;
52          }
53          else if (match.getValue().compareTo("\f") == 0)
54          {
55             Assert.assertFalse(foundFormfeed);
56             Assert.assertEquals(4, match.getIndex());
57             foundFormfeed = true;
58          }
59          else if (match.getValue().compareTo("\b") == 0)
60          {
61             Assert.assertFalse(foundBackspace);
62             Assert.assertEquals(9, match.getIndex());
63             foundBackspace = true;
64          }
65          else if (match.getValue().compareTo("\r") == 0)
66          {
67             Assert.assertFalse(foundCarriageReturn);
68             Assert.assertEquals(11, match.getIndex());
69             foundCarriageReturn = true;
70          }
71          else if (match.getValue().compareTo("\u001b") == 0)
72          {
73             Assert.assertFalse(foundFirstESCMarker);
74             Assert.assertEquals(13, match.getIndex());
75             foundFirstESCMarker = true;
76          }
77          else if (match.getValue().compareTo("\u009b") == 0)
78          {
79             Assert.assertFalse(foundSecondESCMarker);
80             Assert.assertEquals(18, match.getIndex());
81             foundSecondESCMarker = true;
82          }
83          match = match.nextMatch();
84       }
85       Assert.assertTrue(foundLinefeed);
86       Assert.assertTrue(foundFormfeed);
87       Assert.assertTrue(foundBackspace);
88       Assert.assertTrue(foundCarriageReturn);
89    }
90 
testBoldItalicOnOff()91    public void testBoldItalicOnOff()
92    {
93       AnsiCode ansi = new AnsiCode();
94 
95       String boldOn = "\033[1m";
96       AnsiCode.AnsiClazzes newClazz = ansi.processCode(boldOn);
97       Assert.assertEquals("xtermBold", newClazz.inlineClazzes);
98       Assert.assertNull(newClazz.blockClazzes);
99 
100       String italicOn = "\033[3m";
101       newClazz = ansi.processCode(italicOn);
102       Assert.assertEquals("xtermBold xtermItalic", newClazz.inlineClazzes);
103       Assert.assertNull(newClazz.blockClazzes);
104 
105       String boldOff = "\033[22m";
106       newClazz = ansi.processCode(boldOff);
107       Assert.assertEquals("xtermItalic", newClazz.inlineClazzes);
108       Assert.assertNull(newClazz.blockClazzes);
109 
110       String italicOff = "\033[23m";
111       newClazz = ansi.processCode(italicOff);
112       Assert.assertNull(newClazz.inlineClazzes);
113       Assert.assertNull(newClazz.blockClazzes);
114    }
115 
testSimpleColors()116    public void testSimpleColors()
117    {
118       AnsiCode ansi = new AnsiCode();
119 
120       String redFg = "\033[31m";
121       AnsiCode.AnsiClazzes newClazz = ansi.processCode(redFg);
122       Assert.assertEquals("xtermColor1", newClazz.inlineClazzes);
123       Assert.assertNull(newClazz.blockClazzes);
124 
125       String cyanFg = "\033[36m";
126       newClazz = ansi.processCode(cyanFg);
127       Assert.assertEquals("xtermColor6", newClazz.inlineClazzes);
128       Assert.assertNull(newClazz.blockClazzes);
129 
130       String blueBg = "\033[44m";
131       newClazz = ansi.processCode(blueBg);
132       Assert.assertEquals("xtermColor6 xtermBgColor4", newClazz.inlineClazzes);
133       Assert.assertNull(newClazz.blockClazzes);
134 
135       String resetFg = "\033[39m";
136       newClazz = ansi.processCode(resetFg);
137       Assert.assertEquals("xtermBgColor4", newClazz.inlineClazzes);
138       Assert.assertNull(newClazz.blockClazzes);
139 
140       String resetBg = "\033[49m";
141       newClazz = ansi.processCode(resetBg);
142       Assert.assertNull(newClazz.inlineClazzes);
143       Assert.assertNull(newClazz.blockClazzes);
144    }
145 
testFontNineOnOff()146    public void testFontNineOnOff()
147    {
148       AnsiCode ansi = new AnsiCode();
149 
150       String fontNine = "\033[19m";
151       AnsiCode.AnsiClazzes newClazz = ansi.processCode(fontNine);
152       Assert.assertEquals("xtermFont9", newClazz.blockClazzes);
153       Assert.assertNull(newClazz.inlineClazzes);
154 
155       String defaultFont = "\033[10m";
156       newClazz = ansi.processCode(defaultFont);
157       Assert.assertNull(newClazz.blockClazzes);
158       Assert.assertNull(newClazz.inlineClazzes);
159    }
160 
testFontNineWithColors()161    public void testFontNineWithColors()
162    {
163       AnsiCode ansi = new AnsiCode();
164 
165       String redFg = "\033[31m";
166       AnsiCode.AnsiClazzes newClazz = ansi.processCode(redFg);
167 
168       String fontNine = "\033[19m";
169       newClazz = ansi.processCode(fontNine);
170       Assert.assertEquals("xtermFont9", newClazz.blockClazzes);
171       Assert.assertEquals("xtermColor1", newClazz.inlineClazzes);
172 
173       String defaultFont = "\033[10m";
174       newClazz = ansi.processCode(defaultFont);
175       Assert.assertNull(newClazz.blockClazzes);
176       Assert.assertEquals("xtermColor1", newClazz.inlineClazzes);
177 
178       String resetAll = "\033[0m";
179       newClazz = ansi.processCode(resetAll);
180       Assert.assertNull(newClazz.blockClazzes);
181       Assert.assertNull(newClazz.inlineClazzes);
182     }
183 }
184