Advertisement
JeffGrigg

Untitled

Dec 9th, 2017
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 4.62 KB | None | 0 0
  1. import junit.framework.TestCase;
  2.  
  3. public class Lucifere20171208Test extends TestCase {
  4.  
  5.     public void testKnownEncodings() {
  6.         assertFirstEncodesToSecondAndBack("", "");
  7.  
  8.         assertFirstEncodesToSecondAndBack("a", "0");
  9.         assertFirstEncodesToSecondAndBack("b", "01");
  10.         assertFirstEncodesToSecondAndBack("c", "11");
  11.  
  12.         assertFirstEncodesToSecondAndBack("aa", "00");
  13.         assertFirstEncodesToSecondAndBack("bb", "0101");
  14.         assertFirstEncodesToSecondAndBack("cc", "1111");
  15.  
  16.         assertFirstEncodesToSecondAndBack("ab", "001");
  17.         assertFirstEncodesToSecondAndBack("ac", "011");
  18.         assertFirstEncodesToSecondAndBack("ba", "010");
  19.         assertFirstEncodesToSecondAndBack("bc", "0111");
  20.         assertFirstEncodesToSecondAndBack("ca", "110");
  21.         assertFirstEncodesToSecondAndBack("cb", "1101");
  22.     }
  23.  
  24.     public void testGeneratedStrings() {
  25.         final StringBuilder inputValue = new StringBuilder();
  26.         while (inputValue.length() <= 13) {
  27.             boolean carry = true;
  28.             for (int idx = inputValue.length() - 1; idx >= 0 && carry; --idx) {
  29.                 final char nextChar = (char)(inputValue.charAt(idx) + 1);
  30.                 if (nextChar <= 'c') {
  31.                     inputValue.setCharAt(idx, nextChar);
  32.                     carry = false;
  33.                 } else {
  34.                     inputValue.setCharAt(idx, 'a');
  35.                     carry = true;
  36.                 }
  37.             }
  38.             if (carry) {
  39.                 inputValue.insert(0, "a");
  40.             }
  41.             final String plainText = inputValue.toString();
  42.             //System.out.println(plainText);
  43.             final String encodedValue = encode(plainText);
  44.             assertEquals("Plain text <" + plainText + ">, encoded as <" + encodedValue + ">;", plainText, decode(encodedValue));
  45.         }
  46.     }
  47.  
  48.     public void testBadEncodedString() {
  49.         try {
  50.             decode("1");
  51.             fail("Expected IllegalStateException.");
  52.         } catch (final IllegalStateException ex) {
  53.             assertEquals("Encoded string started with a 'wayward' '1' char <1>.", ex.getMessage());
  54.         }
  55.     }
  56.  
  57.     public void testBadCharacterInEncodedString() {
  58.         try {
  59.             decode("020");
  60.             fail("Expected IllegalStateException.");
  61.         } catch (final IllegalStateException ex) {
  62.             assertEquals("Not expecting character <2> in value to decode <020>.  Only '0' and '1' are valid.", ex.getMessage());
  63.         }
  64.     }
  65.  
  66.     private static void assertFirstEncodesToSecondAndBack(final String plainText, final String encodedString) {
  67.         assertEquals("Plain text string <" + plainText + "> encoding;", encodedString, encode(plainText));
  68.         assertEquals("Encoded text string <" + encodedString + "> decoding;", plainText, decode(encodedString));
  69.     }
  70.  
  71.     private static String encode(final String plainText) {
  72.         final StringBuilder encodedValue = new StringBuilder();
  73.         for (final char chr : plainText.toCharArray()) {
  74.             switch (chr) {
  75.                 case 'a': encodedValue.append("0"); break;
  76.                 case 'b': encodedValue.append("01"); break;
  77.                 case 'c': encodedValue.append("11"); break;
  78.             }
  79.         }
  80.         return encodedValue.toString();
  81.     }
  82.  
  83.     private static String decode(String encodedString) {
  84.  
  85.         final StringBuilder decodedValue = new StringBuilder();
  86.  
  87.         boolean lastCharWasOne = false;
  88.         for (final char chr : new StringBuilder(encodedString).reverse().toString().toCharArray()) {
  89.             switch (chr) {
  90.                 case '0':
  91.                     if (lastCharWasOne) {
  92.                         decodedValue.append('b');
  93.                         lastCharWasOne = false;
  94.                     } else {
  95.                         decodedValue.append('a');
  96.                     }
  97.                     break;
  98.  
  99.                 case '1':
  100.                     if (lastCharWasOne) {
  101.                         decodedValue.append('c');
  102.                         lastCharWasOne = false;
  103.                     } else {
  104.                         lastCharWasOne = true;
  105.                     }
  106.                     break;
  107.  
  108.                 default:
  109.                     throw new IllegalStateException("Not expecting character <" + chr + "> in value to decode <" + encodedString + ">.  Only '0' and '1' are valid.");
  110.             }
  111.         }
  112.  
  113.         if (lastCharWasOne) {
  114.             throw new IllegalStateException("Encoded string started with a 'wayward' '1' char <" + encodedString + ">.");
  115.         }
  116.  
  117.         return decodedValue.reverse().toString();
  118.     }
  119.  
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement