// Path: src/main/java/uk/org/okapibarcode/util/Strings.java
// public static String escape(String s) {
//     StringBuilder sb = new StringBuilder(s.length() + 10);
//     for (int i = 0; i < s.length(); i++) {
//         char c = s.charAt(i);
//         switch (c) {
//             case '\u0000':
//                 sb.append("\\0"); // null
//                 break;
//             case '\u0004':
//                 sb.append("\\E"); // end of transmission
//                 break;
//             case '\u0007':
//                 sb.append("\\a"); // bell
//                 break;
//             case '\u0008':
//                 sb.append("\\b"); // backspace
//                 break;
//             case '\u0009':
//                 sb.append("\\t"); // horizontal tab
//                 break;
//             case '\n':
//                 sb.append("\\n"); // line feed
//                 break;
//             case '\u000b':
//                 sb.append("\\v"); // vertical tab
//                 break;
//             case '\u000c':
//                 sb.append("\\f"); // form feed
//                 break;
//             case '\r':
//                 sb.append("\\r"); // carriage return
//                 break;
//             case '\u001b':
//                 sb.append("\\e"); // escape
//                 break;
//             case '\u001d':
//                 sb.append("\\G"); // group separator
//                 break;
//             case '\u001e':
//                 sb.append("\\R"); // record separator
//                 break;
//             case '\\':
//                 sb.append("\\\\"); // escape the escape character
//                 break;
//             default:
//                 if (c >= 32 && c <= 126) {
//                     sb.append(c); // printable ASCII
//                 } else {
//                     byte[] bytes = String.valueOf(c).getBytes(ISO_8859_1);
//                     String hex = String.format("%02X", bytes[0] & 0xFF);
//                     sb.append("\\x").append(hex);
//                 }
//                 break;
//         }
//     }
//     return sb.toString();
// }
// 
// Path: src/main/java/uk/org/okapibarcode/util/Strings.java
// public static String unescape(String s, boolean lenient) {
//     StringBuilder sb = new StringBuilder(s.length());
//     for (int i = 0; i < s.length(); i++) {
//         char c = s.charAt(i);
//         if (c != '\\') {
//             sb.append(c);
//         } else {
//             if (i + 1 >= s.length()) {
//                 String msg = "Error processing escape sequences: expected escape character, found end of string";
//                 throw new OkapiException(msg);
//             } else {
//                 char c2 = s.charAt(i + 1);
//                 switch (c2) {
//                     case '0':
//                         sb.append('\u0000'); // null
//                         i++;
//                         break;
//                     case 'E':
//                         sb.append('\u0004'); // end of transmission
//                         i++;
//                         break;
//                     case 'a':
//                         sb.append('\u0007'); // bell
//                         i++;
//                         break;
//                     case 'b':
//                         sb.append('\u0008'); // backspace
//                         i++;
//                         break;
//                     case 't':
//                         sb.append('\u0009'); // horizontal tab
//                         i++;
//                         break;
//                     case 'n':
//                         sb.append('\n'); // line feed
//                         i++;
//                         break;
//                     case 'v':
//                         sb.append('\u000b'); // vertical tab
//                         i++;
//                         break;
//                     case 'f':
//                         sb.append('\u000c'); // form feed
//                         i++;
//                         break;
//                     case 'r':
//                         sb.append('\r'); // carriage return
//                         i++;
//                         break;
//                     case 'e':
//                         sb.append('\u001b'); // escape
//                         i++;
//                         break;
//                     case 'G':
//                         sb.append('\u001d'); // group separator
//                         i++;
//                         break;
//                     case 'R':
//                         sb.append('\u001e'); // record separator
//                         i++;
//                         break;
//                     case '\\':
//                         sb.append('\\'); // escape the escape character
//                         i++;
//                         break;
//                     case 'x':
//                         if (i + 3 >= s.length()) {
//                             String msg = "Error processing escape sequences: expected hex sequence, found end of string";
//                             throw new OkapiException(msg);
//                         } else {
//                             char c3 = s.charAt(i + 2);
//                             char c4 = s.charAt(i + 3);
//                             if (isHex(c3) && isHex(c4)) {
//                                 byte b = (byte) Integer.parseInt("" + c3 + c4, 16);
//                                 sb.append(new String(new byte[] { b }, StandardCharsets.ISO_8859_1));
//                                 i += 3;
//                             } else {
//                                 String msg = "Error processing escape sequences: expected hex sequence, found '" + c3 + c4 + "'";
//                                 throw new OkapiException(msg);
//                             }
//                         }
//                         break;
//                     default:
//                         if (lenient) {
//                             sb.append(c);
//                         } else {
//                             throw new OkapiException("Error processing escape sequences: expected valid escape character, found '" + c2 + "'");
//                         }
//                 }
//             }
//         }
//     }
//     return sb.toString();
// }


import static org.junit.Assert.assertEquals;
import static uk.org.okapibarcode.util.Strings.escape;
import static uk.org.okapibarcode.util.Strings.unescape;
import org.junit.Test;
/*
 * Copyright 2020 Daniel Gredler
 *
 * 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 uk.org.okapibarcode.util;



/**
 * Tests for {@link Strings}.
 */
public class StringsTest {

    @Test
    public void testUnescape() {
// Path: src/main/java/uk/org/okapibarcode/util/Strings.java
// public static String escape(String s) {
//     StringBuilder sb = new StringBuilder(s.length() + 10);
//     for (int i = 0; i < s.length(); i++) {
//         char c = s.charAt(i);
//         switch (c) {
//             case '\u0000':
//                 sb.append("\\0"); // null
//                 break;
//             case '\u0004':
//                 sb.append("\\E"); // end of transmission
//                 break;
//             case '\u0007':
//                 sb.append("\\a"); // bell
//                 break;
//             case '\u0008':
//                 sb.append("\\b"); // backspace
//                 break;
//             case '\u0009':
//                 sb.append("\\t"); // horizontal tab
//                 break;
//             case '\n':
//                 sb.append("\\n"); // line feed
//                 break;
//             case '\u000b':
//                 sb.append("\\v"); // vertical tab
//                 break;
//             case '\u000c':
//                 sb.append("\\f"); // form feed
//                 break;
//             case '\r':
//                 sb.append("\\r"); // carriage return
//                 break;
//             case '\u001b':
//                 sb.append("\\e"); // escape
//                 break;
//             case '\u001d':
//                 sb.append("\\G"); // group separator
//                 break;
//             case '\u001e':
//                 sb.append("\\R"); // record separator
//                 break;
//             case '\\':
//                 sb.append("\\\\"); // escape the escape character
//                 break;
//             default:
//                 if (c >= 32 && c <= 126) {
//                     sb.append(c); // printable ASCII
//                 } else {
//                     byte[] bytes = String.valueOf(c).getBytes(ISO_8859_1);
//                     String hex = String.format("%02X", bytes[0] & 0xFF);
//                     sb.append("\\x").append(hex);
//                 }
//                 break;
//         }
//     }
//     return sb.toString();
// }
// 
// Path: src/main/java/uk/org/okapibarcode/util/Strings.java
// public static String unescape(String s, boolean lenient) {
//     StringBuilder sb = new StringBuilder(s.length());
//     for (int i = 0; i < s.length(); i++) {
//         char c = s.charAt(i);
//         if (c != '\\') {
//             sb.append(c);
//         } else {
//             if (i + 1 >= s.length()) {
//                 String msg = "Error processing escape sequences: expected escape character, found end of string";
//                 throw new OkapiException(msg);
//             } else {
//                 char c2 = s.charAt(i + 1);
//                 switch (c2) {
//                     case '0':
//                         sb.append('\u0000'); // null
//                         i++;
//                         break;
//                     case 'E':
//                         sb.append('\u0004'); // end of transmission
//                         i++;
//                         break;
//                     case 'a':
//                         sb.append('\u0007'); // bell
//                         i++;
//                         break;
//                     case 'b':
//                         sb.append('\u0008'); // backspace
//                         i++;
//                         break;
//                     case 't':
//                         sb.append('\u0009'); // horizontal tab
//                         i++;
//                         break;
//                     case 'n':
//                         sb.append('\n'); // line feed
//                         i++;
//                         break;
//                     case 'v':
//                         sb.append('\u000b'); // vertical tab
//                         i++;
//                         break;
//                     case 'f':
//                         sb.append('\u000c'); // form feed
//                         i++;
//                         break;
//                     case 'r':
//                         sb.append('\r'); // carriage return
//                         i++;
//                         break;
//                     case 'e':
//                         sb.append('\u001b'); // escape
//                         i++;
//                         break;
//                     case 'G':
//                         sb.append('\u001d'); // group separator
//                         i++;
//                         break;
//                     case 'R':
//                         sb.append('\u001e'); // record separator
//                         i++;
//                         break;
//                     case '\\':
//                         sb.append('\\'); // escape the escape character
//                         i++;
//                         break;
//                     case 'x':
//                         if (i + 3 >= s.length()) {
//                             String msg = "Error processing escape sequences: expected hex sequence, found end of string";
//                             throw new OkapiException(msg);
//                         } else {
//                             char c3 = s.charAt(i + 2);
//                             char c4 = s.charAt(i + 3);
//                             if (isHex(c3) && isHex(c4)) {
//                                 byte b = (byte) Integer.parseInt("" + c3 + c4, 16);
//                                 sb.append(new String(new byte[] { b }, StandardCharsets.ISO_8859_1));
//                                 i += 3;
//                             } else {
//                                 String msg = "Error processing escape sequences: expected hex sequence, found '" + c3 + c4 + "'";
//                                 throw new OkapiException(msg);
//                             }
//                         }
//                         break;
//                     default:
//                         if (lenient) {
//                             sb.append(c);
//                         } else {
//                             throw new OkapiException("Error processing escape sequences: expected valid escape character, found '" + c2 + "'");
//                         }
//                 }
//             }
//         }
//     }
//     return sb.toString();
// }


// Path: src/test/java/uk/org/okapibarcode/util/StringsTest.java
import static org.junit.Assert.assertEquals;
import static uk.org.okapibarcode.util.Strings.escape;
import static uk.org.okapibarcode.util.Strings.unescape;
import org.junit.Test;

/*
 * Copyright 2020 Daniel Gredler
 *
 * 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 uk.org.okapibarcode.util;



/**
 * Tests for {@link Strings}.
 */
public class StringsTest {

    @Test
    public void testUnescape() {
        assertEquals("", unescape("", false));