/* * Copyright 2010 Google Inc. * * 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 com.google.gwt.dev.util.editdistance; import com.google.gwt.dev.util.editdistance.GeneralEditDistance; import com.google.gwt.dev.util.editdistance.MyersBitParallelEditDistance; import junit.framework.TestCase; /** * Test cases for the MyersBitParallelEditDistance class. * * Note that the GeneralEditDistance class tests provide * good general coverage of this class as well. * * The tests here look for boundary conditions in the * specific algorithm: near 32- and 64-bit edges. */ public class MyersBitParallelEditDistanceTest extends TestCase { /** Generates an instance (just a notational shorthand) */ static MyersBitParallelEditDistance generate(String pattern) { return MyersBitParallelEditDistance.getInstance(pattern); } public void test32end() { String s1 = "abcdefghijklmnopqrstuvwxyz012345"; String s2 = "abcdefghijklmnopqrstuvwxyz01234"; GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2, 1); GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2+"x", 1); } public void test32start() { String s1 = "abcdefghijklmnopqrstuvwxyz012345"; String s2 = "Abcdefghijklmnopqrstuvwxyz012345"; GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2, 1); GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2.substring(1), 1); } public void test32various() { String s1 = "abcdefghijklmnopqrstuvwxyz012345"; String s2 = "abcdeghijklmNopqrstu@vwxyz1234"; GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2, 5 /*fN@05*/); } /* * Some tests with strings exactly 32 characters long -- just enough * for an "int" bitmap. */ public void test33end() { String s1 = "abcdefghijklmnopqrstuvwxyz0123456"; String s2 = "abcdefghijklmnopqrstuvwxyz012345"; GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2, 1); GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2+"x", 1); } public void test33start() { String s1 = "abcdefghijklmnopqrstuvwxyz0123456"; String s2 = "Abcdefghijklmnopqrstuvwxyz0123456"; GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2, 1); GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2.substring(1), 1); } public void test64end() { String s1 = "abcdefghijklmnopqrstuvwxyz0123456"; String s2 = "abcdefghijklmnopqrstuvwxyz012345"; GeneralEditDistanceTest.genericVerification(generate(s1+s1), s1+s1, s1+s2, 1); GeneralEditDistanceTest.genericVerification(generate(s1+s1), s1+s1, s1+s2+"x", 1); } public void test64middle() { String s1 = "abcdefghijklmnopqrstuvwxyz0123456"; String s2 = "abcdefghijklmnopqrstuvwxyz012345"; GeneralEditDistanceTest.genericVerification(generate(s1+s1), s1+s1, s1+"x"+s2, 2); GeneralEditDistanceTest.genericVerification(generate(s1+s1), s1+s1, s2+"x"+s1, 1); } public void test64start() { String s1 = "abcdefghijklmnopqrstuvwxyz0123456"; String s2 = "Abcdefghijklmnopqrstuvwxyz0123456"; GeneralEditDistanceTest.genericVerification(generate(s1+s1), s1+s1, s2+s1, 1); GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2.substring(1), 1); } public void testbig() { String s1base = "abcdefghijklmnopqrstuvwxyz0123456"; String s1 = s1base + s1base + s1base + s1base + s1base; String s2 = s1base + "abcdeghijklmNopqrstu@vwxyz12346" + s1base + "bcdefGhijklmno$pqrstuvwxyz012345" + s1base; GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2, 5+4 /*fN@05, aG$6*/); } /** Verifies the choice of bit array sizing */ public void testBitArraySizing() { String thirtyTwo = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; assertEquals(generate("").getClass(), MyersBitParallelEditDistance.Empty.class); assertEquals(generate(thirtyTwo).getClass(), MyersBitParallelEditDistance.TYPEint.class); assertEquals(generate(thirtyTwo+"x").getClass(), MyersBitParallelEditDistance.TYPElong.class); assertEquals(generate(thirtyTwo+thirtyTwo).getClass(), MyersBitParallelEditDistance.TYPElong.class); assertEquals(generate(thirtyTwo+thirtyTwo+"x").getClass(), MyersBitParallelEditDistance.Multi.class); } /** Tests an "impossible" exception path */ public void testInternalCloneNotSupportedException() { try { new MyersBitParallelEditDistance.Multi("not really impossible") { @Override public Object clone() throws CloneNotSupportedException { throw new CloneNotSupportedException("do the impossible"); } }.duplicate(); assertTrue("Failed to throw exception", false); } catch (IllegalStateException x) { /* EXPECTED RESULT */ } } /** Test main programs to make sure they do not die unnaturally */ public void testMainProgramsForSanity() { MyersBitParallelEditDistance.main(new String[] { "yes", "no", "5" }); MyersBitParallelEditDistance.Multi.main(new String[] { "yes", "no", "5" }); } /** Test on a variety of word pairs, reusing an instance appropriately */ public void testOnWordSet() { String [] words = GeneralEditDistanceTest.words; int [][] expect = GeneralEditDistanceTest.wordsDistances; for (int i = 0; i < words.length; i++) { GeneralEditDistance engine = generate(words[i]); for (int j = 0; j <= i; j++) { GeneralEditDistanceTest.genericVerification(engine, words[i], words[j], expect[i][j]); } } } /** Tests a short pattern and target */ public void testShort() { String s1 = "short"; String s2 = "snorts"; GeneralEditDistanceTest.genericVerification(generate(s1), s1, s2, 2); } /** Tests zero-length patterns and targets; distance is other length */ public void testZeroLength() { assertEquals(0, generate("").getDistance("", 1)); String other = "other"; GeneralEditDistanceTest.genericVerification(generate(""), "", other, other.length()); GeneralEditDistanceTest.genericVerification(generate(other), other, "", other.length()); } }