001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package org.apache.commons.codec;
019
020import java.util.Locale;
021
022import org.junit.Assert;
023
024import org.junit.Test;
025
026/**
027 * @version $Id: StringEncoderAbstractTest.html 891688 2013-12-24 20:49:46Z ggregory $
028 */
029public abstract class StringEncoderAbstractTest<T extends StringEncoder> {
030
031    protected T stringEncoder = this.createStringEncoder();
032
033    public void checkEncoding(final String expected, final String source) throws EncoderException {
034        Assert.assertEquals("Source: " + source, expected, this.getStringEncoder().encode(source));
035    }
036
037    protected void checkEncodings(final String[][] data) throws EncoderException {
038        for (final String[] element : data) {
039            this.checkEncoding(element[1], element[0]);
040        }
041    }
042
043    protected void checkEncodingVariations(final String expected, final String data[]) throws EncoderException {
044        for (final String element : data) {
045            this.checkEncoding(expected, element);
046        }
047    }
048
049    protected abstract T createStringEncoder();
050
051    public T getStringEncoder() {
052        return this.stringEncoder;
053    }
054
055    @Test
056    public void testEncodeEmpty() throws Exception {
057        final Encoder encoder = this.getStringEncoder();
058        encoder.encode("");
059        encoder.encode(" ");
060        encoder.encode("\t");
061    }
062
063    @Test
064    public void testEncodeNull() throws Exception {
065        final StringEncoder encoder = this.getStringEncoder();
066        try {
067            encoder.encode(null);
068        } catch (final EncoderException ee) {
069            // An exception should be thrown
070        }
071    }
072
073    @Test
074    public void testEncodeWithInvalidObject() throws Exception {
075        boolean exceptionThrown = false;
076        try {
077            final StringEncoder encoder = this.getStringEncoder();
078            encoder.encode(new Float(3.4));
079        } catch (final Exception e) {
080            exceptionThrown = true;
081        }
082        Assert.assertTrue("An exception was not thrown when we tried to encode " + "a Float object", exceptionThrown);
083    }
084
085    @Test
086    public void testLocaleIndependence() throws Exception {
087        final StringEncoder encoder = this.getStringEncoder();
088
089        final String[] data = {"I", "i",};
090
091        final Locale orig = Locale.getDefault();
092        final Locale[] locales = {Locale.ENGLISH, new Locale("tr"), Locale.getDefault()};
093
094        try {
095            for (final String element : data) {
096                String ref = null;
097                for (int j = 0; j < locales.length; j++) {
098                    Locale.setDefault(locales[j]);
099                    if (j <= 0) {
100                        ref = encoder.encode(element);
101                    } else {
102                        String cur = null;
103                        try {
104                            cur = encoder.encode(element);
105                        } catch (final Exception e) {
106                            Assert.fail(Locale.getDefault().toString() + ": " + e.getMessage());
107                        }
108                        Assert.assertEquals(Locale.getDefault().toString() + ": ", ref, cur);
109                    }
110                }
111            }
112        } finally {
113            Locale.setDefault(orig);
114        }
115    }
116
117}