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