1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 4 // 5 // Redistribution and use in source and binary forms, with or without 6 // modification, are permitted provided that the following conditions are 7 // met: 8 // 9 // * Redistributions of source code must retain the above copyright 10 // notice, this list of conditions and the following disclaimer. 11 // * Redistributions in binary form must reproduce the above 12 // copyright notice, this list of conditions and the following disclaimer 13 // in the documentation and/or other materials provided with the 14 // distribution. 15 // * Neither the name of Google Inc. nor the names of its 16 // contributors may be used to endorse or promote products derived from 17 // this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 package com.google.protobuf; 32 33 import java.io.UnsupportedEncodingException; 34 import java.util.Iterator; 35 36 /** 37 * This class tests {@link RopeByteString#substring(int, int)} by inheriting the tests from {@link 38 * LiteralByteStringTest}. Only a couple of methods are overridden. 39 * 40 * @author carlanton@google.com (Carl Haverl) 41 */ 42 public class RopeByteStringSubstringTest extends LiteralByteStringTest { 43 44 @Override setUp()45 protected void setUp() throws Exception { 46 classUnderTest = "RopeByteString"; 47 byte[] sourceBytes = ByteStringTest.getTestBytes(22341, 22337766L); 48 Iterator<ByteString> iter = ByteStringTest.makeConcretePieces(sourceBytes).iterator(); 49 ByteString sourceString = iter.next(); 50 while (iter.hasNext()) { 51 sourceString = sourceString.concat(iter.next()); 52 } 53 54 int from = 1130; 55 int to = sourceBytes.length - 5555; 56 stringUnderTest = sourceString.substring(from, to); 57 referenceBytes = new byte[to - from]; 58 System.arraycopy(sourceBytes, from, referenceBytes, 0, to - from); 59 expectedHashCode = -1259260680; 60 } 61 62 @Override testGetTreeDepth()63 public void testGetTreeDepth() { 64 assertEquals( 65 classUnderTest + " must have the expected tree depth", 3, stringUnderTest.getTreeDepth()); 66 } 67 68 @Override testToString()69 public void testToString() throws UnsupportedEncodingException { 70 String sourceString = "I love unicode \u1234\u5678 characters"; 71 ByteString sourceByteString = ByteString.copyFromUtf8(sourceString); 72 int copies = 250; 73 74 // By building the RopeByteString by concatenating, this is actually a fairly strenuous test. 75 StringBuilder builder = new StringBuilder(copies * sourceString.length()); 76 ByteString unicode = ByteString.EMPTY; 77 for (int i = 0; i < copies; ++i) { 78 builder.append(sourceString); 79 unicode = RopeByteString.concatenate(unicode, sourceByteString); 80 } 81 String testString = builder.toString(); 82 83 // Do the substring part 84 testString = testString.substring(2, testString.length() - 6); 85 unicode = unicode.substring(2, unicode.size() - 6); 86 87 assertEquals( 88 classUnderTest + " from string must have the expected type", 89 classUnderTest, 90 getActualClassName(unicode)); 91 String roundTripString = unicode.toString(UTF_8); 92 assertEquals(classUnderTest + " unicode bytes must match", testString, roundTripString); 93 ByteString flatString = ByteString.copyFromUtf8(testString); 94 assertEquals(classUnderTest + " string must equal the flat string", flatString, unicode); 95 assertEquals( 96 classUnderTest + " string must must have same hashCode as the flat string", 97 flatString.hashCode(), 98 unicode.hashCode()); 99 } 100 101 @Override testCharsetToString()102 public void testCharsetToString() { 103 String sourceString = "I love unicode \u1234\u5678 characters"; 104 ByteString sourceByteString = ByteString.copyFromUtf8(sourceString); 105 int copies = 250; 106 107 // By building the RopeByteString by concatenating, this is actually a fairly strenuous test. 108 StringBuilder builder = new StringBuilder(copies * sourceString.length()); 109 ByteString unicode = ByteString.EMPTY; 110 for (int i = 0; i < copies; ++i) { 111 builder.append(sourceString); 112 unicode = RopeByteString.concatenate(unicode, sourceByteString); 113 } 114 String testString = builder.toString(); 115 116 // Do the substring part 117 testString = testString.substring(2, testString.length() - 6); 118 unicode = unicode.substring(2, unicode.size() - 6); 119 120 assertEquals( 121 classUnderTest + " from string must have the expected type", 122 classUnderTest, 123 getActualClassName(unicode)); 124 String roundTripString = unicode.toString(Internal.UTF_8); 125 assertEquals(classUnderTest + " unicode bytes must match", testString, roundTripString); 126 ByteString flatString = ByteString.copyFromUtf8(testString); 127 assertEquals(classUnderTest + " string must equal the flat string", flatString, unicode); 128 assertEquals( 129 classUnderTest + " string must must have same hashCode as the flat string", 130 flatString.hashCode(), 131 unicode.hashCode()); 132 } 133 } 134