/* * ModeShape (http://www.modeshape.org) * * 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 org.modeshape.common.text; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import org.junit.Test; /** * Unit test for {@link XmlNameEncoder} * * @author Randall Hauch * @author Horia Chiorean */ public class XmlNameEncoderTest { private XmlNameEncoder encoder = new XmlNameEncoder(); protected void checkEncoding( String input, String expected ) { String output = this.encoder.encode(input); assertThat(output, is(notNullValue())); assertEquals(expected, output); assertThat(output.length(), is(expected.length())); assertThat(output, is(expected)); checkDecoding(output, input); } protected void checkForNoEncoding( String input ) { String output = this.encoder.encode(input); assertThat(output, is(notNullValue())); assertEquals(input, output); assertThat(output.length(), is(input.length())); assertThat(output, is(input)); checkForNoDecoding(input); } protected void checkForNoDecoding( String input ) { String output = this.encoder.decode(input); assertThat(output, is(notNullValue())); assertEquals(input, output); assertThat(output.length(), is(input.length())); assertThat(output, is(input)); } protected void checkDecoding( String input, String output ) { String decoded = this.encoder.decode(input); assertEquals(output, decoded); assertThat(decoded.length(), is(output.length())); assertThat(decoded, is(output)); } @Test public void shouldNotEncodeUnderscoreIfNotFollowedByLowercaseX() { checkForNoEncoding("Employee_ID"); checkForNoEncoding("_Employee_"); checkForNoEncoding("Employee__ID"); } @Test public void shouldEncodeUnderscoreIfFollowedByLowercaseX() { checkEncoding("Employee_x", "Employee_x005f_x"); checkEncoding("Employee_x0", "Employee_x005f_x0"); checkEncoding("Employee_x0022_", "Employee_x005f_x0022_"); } @Test public void shouldNotDecodeIfNotValidHexadecimalValue() { checkForNoDecoding("_xH013_"); } @Test public void shouldNotDecodeIfNotValidEncodedFormat() { checkForNoDecoding("_X0022_"); // No lowercase 'x' checkForNoDecoding("x0022_"); // No leading '_' checkForNoDecoding("_x0022a"); // No trailing '_' } @Test public void shouldNotEncodeDigits() { for (char c = '\u0030'; c <= '\u0039'; c++) { // digit checkForNoEncoding("Employee" + c + "xyz"); } } @Test public void shouldNotEncodeAlphabeticCharacters() { for (char c = '\u0041'; c <= '\u005a'; c++) { // digit checkForNoEncoding("Employee" + c + "xyz"); } for (char c = '\u0061'; c <= '\u007a'; c++) { // digit checkForNoEncoding("Employee" + c + "xyz"); } } @Test public void shouldNotEncodePeriodOrDashOrUnderscoreCharacters() { checkForNoEncoding("Employee.xyz"); checkForNoEncoding("Employee-xyz"); checkForNoEncoding("Employee:xyz"); checkForNoEncoding("Employee_abc"); } @Test public void shouldDecodeIfCompleteHexadecimal() { checkDecoding("Employee_", "Employee_"); checkDecoding("Employee_x", "Employee_x"); checkDecoding("Employee_x0", "Employee_x0"); checkDecoding("Employee_x00", "Employee_x00"); checkDecoding("Employee_x002", "Employee_x002"); checkDecoding("Employee_x0022", "Employee_x0022"); checkDecoding("_", "_"); checkDecoding("_x", "_x"); checkDecoding("_x0", "_x0"); checkDecoding("_x00", "_x00"); checkDecoding("_x002", "_x002"); checkDecoding("_x0022", "_x0022"); } @Test public void shouldEncodeUnderscoreOnlyWhenFollowedByX() { checkEncoding("Employee_xyz", "Employee_x005f_xyz"); checkEncoding("Employee_ayz", "Employee_ayz"); } @Test public void shouldEncodeNonAlphaNumericCharacters() { checkEncoding("Employee!xyz", "Employee_x0021_xyz"); checkEncoding("Employee\"xyz", "Employee_x0022_xyz"); checkEncoding("Employee#xyz", "Employee_x0023_xyz"); checkEncoding("Employee$xyz", "Employee_x0024_xyz"); checkEncoding("Employee%xyz", "Employee_x0025_xyz"); checkEncoding("Employee&xyz", "Employee_x0026_xyz"); checkEncoding("Employee'xyz", "Employee_x0027_xyz"); checkEncoding("Employee(xyz", "Employee_x0028_xyz"); checkEncoding("Employee)xyz", "Employee_x0029_xyz"); checkEncoding("Employee*xyz", "Employee_x002a_xyz"); checkEncoding("Employee+xyz", "Employee_x002b_xyz"); checkEncoding("Employee,xyz", "Employee_x002c_xyz"); checkEncoding("Employee/xyz", "Employee_x002f_xyz"); checkEncoding("Employee\u0B9Bxyz", "Employee_x0b9b_xyz"); } @Test public void shouldEncodeIllegalStartCharacter() { checkEncoding("042b4500-a8bc-4b79-8af0-59fb408ecfa5", "_x0030_42b4500-a8bc-4b79-8af0-59fb408ecfa5"); checkEncoding("-42b4500-a8bc-4b79-8af0-59fb408ecfa5", "_x002d_42b4500-a8bc-4b79-8af0-59fb408ecfa5"); checkEncoding(".42b4500-a8bc-4b79-8af0-59fb408ecfa5", "_x002e_42b4500-a8bc-4b79-8af0-59fb408ecfa5"); } @Test public void shouldDecodeIllegalStartCharacter() { checkDecoding("_x0030_42b4500-a8bc-4b79-8af0-59fb408ecfa5", "042b4500-a8bc-4b79-8af0-59fb408ecfa5"); checkDecoding("_x002d_42b4500-a8bc-4b79-8af0-59fb408ecfa5", "-42b4500-a8bc-4b79-8af0-59fb408ecfa5"); checkDecoding("_x002e_42b4500-a8bc-4b79-8af0-59fb408ecfa5", ".42b4500-a8bc-4b79-8af0-59fb408ecfa5"); } }