1 /* 2 * Copyright (c) 2011 Google, Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.google.common.truth; 17 18 import static com.google.common.truth.ExpectFailure.assertThat; 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.junit.Assert.fail; 21 22 import com.google.common.annotations.GwtIncompatible; 23 import java.util.regex.Pattern; 24 import org.junit.Test; 25 import org.junit.runner.RunWith; 26 import org.junit.runners.JUnit4; 27 28 /** 29 * Tests for String Subjects. 30 * 31 * @author David Saff 32 * @author Christian Gruber ([email protected]) 33 */ 34 @RunWith(JUnit4.class) 35 public class StringSubjectTest extends BaseSubjectTestCase { 36 37 @Test hasLength()38 public void hasLength() { 39 assertThat("kurt").hasLength(4); 40 } 41 42 @Test hasLengthZero()43 public void hasLengthZero() { 44 assertThat("").hasLength(0); 45 } 46 47 @Test hasLengthFails()48 public void hasLengthFails() { 49 expectFailureWhenTestingThat("kurt").hasLength(5); 50 assertFailureValue("value of", "string.length()"); 51 } 52 53 @Test hasLengthNegative()54 public void hasLengthNegative() { 55 try { 56 assertThat("kurt").hasLength(-1); 57 fail(); 58 } catch (IllegalArgumentException expected) { 59 } 60 } 61 62 @Test stringIsEmpty()63 public void stringIsEmpty() { 64 assertThat("").isEmpty(); 65 } 66 67 @Test stringIsEmptyFail()68 public void stringIsEmptyFail() { 69 expectFailureWhenTestingThat("abc").isEmpty(); 70 assertFailureKeys("expected to be empty", "but was"); 71 } 72 73 @Test stringIsEmptyFailNull()74 public void stringIsEmptyFailNull() { 75 expectFailureWhenTestingThat(null).isEmpty(); 76 assertFailureKeys("expected an empty string", "but was"); 77 } 78 79 @Test stringIsNotEmpty()80 public void stringIsNotEmpty() { 81 assertThat("abc").isNotEmpty(); 82 } 83 84 @Test stringIsNotEmptyFail()85 public void stringIsNotEmptyFail() { 86 expectFailureWhenTestingThat("").isNotEmpty(); 87 assertFailureKeys("expected not to be empty"); 88 } 89 90 @Test stringIsNotEmptyFailNull()91 public void stringIsNotEmptyFailNull() { 92 expectFailureWhenTestingThat(null).isNotEmpty(); 93 assertFailureKeys("expected a non-empty string", "but was"); 94 } 95 96 @Test stringContains()97 public void stringContains() { 98 assertThat("abc").contains("c"); 99 } 100 101 @Test stringContainsCharSeq()102 public void stringContainsCharSeq() { 103 CharSequence charSeq = new StringBuilder("c"); 104 assertThat("abc").contains(charSeq); 105 } 106 107 @Test stringContainsFail()108 public void stringContainsFail() { 109 expectFailureWhenTestingThat("abc").contains("d"); 110 assertFailureValue("expected to contain", "d"); 111 } 112 113 @Test stringDoesNotContain()114 public void stringDoesNotContain() { 115 assertThat("abc").doesNotContain("d"); 116 } 117 118 @Test stringDoesNotContainCharSequence()119 public void stringDoesNotContainCharSequence() { 120 CharSequence charSeq = new StringBuilder("d"); 121 assertThat("abc").doesNotContain(charSeq); 122 } 123 124 @Test stringDoesNotContainFail()125 public void stringDoesNotContainFail() { 126 expectFailureWhenTestingThat("abc").doesNotContain("b"); 127 assertFailureValue("expected not to contain", "b"); 128 } 129 130 @Test 131 @SuppressWarnings("TruthSelfEquals") stringEquality()132 public void stringEquality() { 133 assertThat("abc").isEqualTo("abc"); 134 } 135 136 @Test stringEqualityToNull()137 public void stringEqualityToNull() { 138 expectFailureWhenTestingThat("abc").isEqualTo(null); 139 assertThat(expectFailure.getFailure()).isNotInstanceOf(ComparisonFailureWithFacts.class); 140 } 141 142 @Test stringEqualityToEmpty()143 public void stringEqualityToEmpty() { 144 expectFailureWhenTestingThat("abc").isEqualTo(""); 145 assertFailureKeys("expected an empty string", "but was"); 146 } 147 148 @Test stringEqualityEmptyToNonEmpty()149 public void stringEqualityEmptyToNonEmpty() { 150 expectFailureWhenTestingThat("").isEqualTo("abc"); 151 assertFailureKeys("expected", "but was an empty string"); 152 } 153 154 @Test stringEqualityFail()155 public void stringEqualityFail() { 156 expectFailureWhenTestingThat("abc").isEqualTo("ABC"); 157 assertThat(expectFailure.getFailure()).isInstanceOf(ComparisonFailureWithFacts.class); 158 } 159 160 @Test stringStartsWith()161 public void stringStartsWith() { 162 assertThat("abc").startsWith("ab"); 163 } 164 165 @Test stringStartsWithFail()166 public void stringStartsWithFail() { 167 expectFailureWhenTestingThat("abc").startsWith("bc"); 168 assertFailureValue("expected to start with", "bc"); 169 } 170 171 @Test stringEndsWith()172 public void stringEndsWith() { 173 assertThat("abc").endsWith("bc"); 174 } 175 176 @Test stringEndsWithFail()177 public void stringEndsWithFail() { 178 expectFailureWhenTestingThat("abc").endsWith("ab"); 179 assertFailureValue("expected to end with", "ab"); 180 } 181 182 @Test emptyStringTests()183 public void emptyStringTests() { 184 assertThat("").contains(""); 185 assertThat("").startsWith(""); 186 assertThat("").endsWith(""); 187 assertThat("a").contains(""); 188 assertThat("a").startsWith(""); 189 assertThat("a").endsWith(""); 190 } 191 192 @Test stringMatchesString()193 public void stringMatchesString() { 194 assertThat("abcaaadev").matches(".*aaa.*"); 195 } 196 197 @Test stringMatchesStringWithFail()198 public void stringMatchesStringWithFail() { 199 expectFailureWhenTestingThat("abcaqadev").matches(".*aaa.*"); 200 assertFailureValue("expected to match", ".*aaa.*"); 201 } 202 203 @Test stringMatchesStringFailNull()204 public void stringMatchesStringFailNull() { 205 expectFailureWhenTestingThat(null).matches(".*aaa.*"); 206 assertFailureValue("expected a string that matches", ".*aaa.*"); 207 } 208 209 @Test stringMatchesStringLiteralFail()210 public void stringMatchesStringLiteralFail() { 211 expectFailureWhenTestingThat("$abc").matches("$abc"); 212 assertFailureValue("expected to match", "$abc"); 213 assertFailureValue("but was", "$abc"); 214 assertThat(expectFailure.getFailure()) 215 .factKeys() 216 .contains("Looks like you want to use .isEqualTo() for an exact equality assertion."); 217 } 218 219 @Test stringMatchesStringLiteralFailButContainsMatchSuccess()220 public void stringMatchesStringLiteralFailButContainsMatchSuccess() { 221 expectFailureWhenTestingThat("aba").matches("[b]"); 222 assertFailureValue("expected to match", "[b]"); 223 assertFailureValue("but was", "aba"); 224 assertThat(expectFailure.getFailure()) 225 .factKeys() 226 .contains("Did you mean to call containsMatch() instead of match()?"); 227 } 228 229 @Test 230 @GwtIncompatible("Pattern") stringMatchesPattern()231 public void stringMatchesPattern() { 232 assertThat("abcaaadev").matches(Pattern.compile(".*aaa.*")); 233 } 234 235 @Test 236 @GwtIncompatible("Pattern") stringMatchesPatternWithFail()237 public void stringMatchesPatternWithFail() { 238 expectFailureWhenTestingThat("abcaqadev").matches(Pattern.compile(".*aaa.*")); 239 assertFailureValue("expected to match", ".*aaa.*"); 240 } 241 242 @Test 243 @GwtIncompatible("Pattern") stringMatchesPatternFailNull()244 public void stringMatchesPatternFailNull() { 245 expectFailureWhenTestingThat(null).matches(Pattern.compile(".*aaa.*")); 246 assertFailureValue("expected a string that matches", ".*aaa.*"); 247 } 248 249 @Test 250 @GwtIncompatible("Pattern") stringMatchesPatternLiteralFail()251 public void stringMatchesPatternLiteralFail() { 252 expectFailureWhenTestingThat("$abc").matches(Pattern.compile("$abc")); 253 assertFailureValue("expected to match", "$abc"); 254 assertFailureValue("but was", "$abc"); 255 assertThat(expectFailure.getFailure()) 256 .factKeys() 257 .contains( 258 "If you want an exact equality assertion you can escape your regex with" 259 + " Pattern.quote()."); 260 } 261 262 @Test 263 @GwtIncompatible("Pattern") stringMatchesPatternLiteralFailButContainsMatchSuccess()264 public void stringMatchesPatternLiteralFailButContainsMatchSuccess() { 265 expectFailureWhenTestingThat("aba").matches(Pattern.compile("[b]")); 266 assertFailureValue("expected to match", "[b]"); 267 assertFailureValue("but was", "aba"); 268 assertThat(expectFailure.getFailure()) 269 .factKeys() 270 .contains("Did you mean to call containsMatch() instead of match()?"); 271 } 272 273 @Test stringDoesNotMatchString()274 public void stringDoesNotMatchString() { 275 assertThat("abcaqadev").doesNotMatch(".*aaa.*"); 276 } 277 278 @Test stringDoesNotMatchStringWithFail()279 public void stringDoesNotMatchStringWithFail() { 280 expectFailureWhenTestingThat("abcaaadev").doesNotMatch(".*aaa.*"); 281 assertFailureValue("expected not to match", ".*aaa.*"); 282 } 283 284 @Test stringDoesNotMatchStringFailNull()285 public void stringDoesNotMatchStringFailNull() { 286 expectFailureWhenTestingThat(null).doesNotMatch(".*aaa.*"); 287 assertFailureValue("expected a string that does not match", ".*aaa.*"); 288 } 289 290 @Test 291 @GwtIncompatible("Pattern") stringDoesNotMatchPattern()292 public void stringDoesNotMatchPattern() { 293 assertThat("abcaqadev").doesNotMatch(Pattern.compile(".*aaa.*")); 294 } 295 296 @Test 297 @GwtIncompatible("Pattern") stringDoesNotMatchPatternWithFail()298 public void stringDoesNotMatchPatternWithFail() { 299 expectFailureWhenTestingThat("abcaaadev").doesNotMatch(Pattern.compile(".*aaa.*")); 300 assertFailureValue("expected not to match", ".*aaa.*"); 301 } 302 303 @Test 304 @GwtIncompatible("Pattern") stringDoesNotMatchPatternFailNull()305 public void stringDoesNotMatchPatternFailNull() { 306 expectFailureWhenTestingThat(null).doesNotMatch(Pattern.compile(".*aaa.*")); 307 assertFailureValue("expected a string that does not match", ".*aaa.*"); 308 } 309 310 @Test 311 @GwtIncompatible("Pattern") stringContainsMatchStringUsesFind()312 public void stringContainsMatchStringUsesFind() { 313 assertThat("aba").containsMatch("[b]"); 314 assertThat("aba").containsMatch(Pattern.compile("[b]")); 315 } 316 317 @Test stringContainsMatchString()318 public void stringContainsMatchString() { 319 assertThat("aba").containsMatch(".*b.*"); 320 321 expectFailureWhenTestingThat("aaa").containsMatch(".*b.*"); 322 assertFailureValue("expected to contain a match for", ".*b.*"); 323 } 324 325 @Test stringContainsMatchStringFailNull()326 public void stringContainsMatchStringFailNull() { 327 expectFailureWhenTestingThat(null).containsMatch(".*b.*"); 328 assertFailureValue("expected a string that contains a match for", ".*b.*"); 329 } 330 331 @Test 332 @GwtIncompatible("Pattern") stringContainsMatchPattern()333 public void stringContainsMatchPattern() { 334 assertThat("aba").containsMatch(Pattern.compile(".*b.*")); 335 336 expectFailureWhenTestingThat("aaa").containsMatch(Pattern.compile(".*b.*")); 337 assertFailureValue("expected to contain a match for", ".*b.*"); 338 } 339 340 @Test 341 @GwtIncompatible("Pattern") stringContainsMatchPatternFailNull()342 public void stringContainsMatchPatternFailNull() { 343 expectFailureWhenTestingThat(null).containsMatch(Pattern.compile(".*b.*")); 344 assertFailureValue("expected a string that contains a match for", ".*b.*"); 345 } 346 347 @Test stringDoesNotContainMatchString()348 public void stringDoesNotContainMatchString() { 349 assertThat("aaa").doesNotContainMatch(".*b.*"); 350 351 expectFailureWhenTestingThat("aba").doesNotContainMatch(".*b.*"); 352 assertFailureValue("expected not to contain a match for", ".*b.*"); 353 } 354 355 @Test stringDoesNotContainMatchStringUsesFind()356 public void stringDoesNotContainMatchStringUsesFind() { 357 expectFailureWhenTestingThat("aba").doesNotContainMatch("[b]"); 358 assertFailureValue("expected not to contain a match for", "[b]"); 359 } 360 361 @Test stringDoesNotContainMatchStringUsesFindFailNull()362 public void stringDoesNotContainMatchStringUsesFindFailNull() { 363 expectFailureWhenTestingThat(null).doesNotContainMatch("[b]"); 364 assertFailureValue("expected a string that does not contain a match for", "[b]"); 365 } 366 367 @Test 368 @GwtIncompatible("Pattern") stringDoesNotContainMatchPattern()369 public void stringDoesNotContainMatchPattern() { 370 assertThat("zzaaazz").doesNotContainMatch(Pattern.compile(".b.")); 371 372 expectFailureWhenTestingThat("zzabazz").doesNotContainMatch(Pattern.compile(".b.")); 373 assertFailureValue("expected not to contain a match for", ".b."); 374 assertFailureValue("but contained", "aba"); 375 assertFailureValue("full string", "zzabazz"); 376 } 377 378 @Test 379 @GwtIncompatible("Pattern") stringDoesNotContainMatchPatternFailNull()380 public void stringDoesNotContainMatchPatternFailNull() { 381 expectFailureWhenTestingThat(null).doesNotContainMatch(Pattern.compile(".b.")); 382 assertFailureValue("expected a string that does not contain a match for", ".b."); 383 } 384 385 @Test stringEqualityIgnoringCase()386 public void stringEqualityIgnoringCase() { 387 assertThat("café").ignoringCase().isEqualTo("CAFÉ"); 388 } 389 390 @Test stringEqualityIgnoringCaseWithNullSubject()391 public void stringEqualityIgnoringCaseWithNullSubject() { 392 assertThat((String) null).ignoringCase().isEqualTo(null); 393 } 394 395 @Test stringEqualityIgnoringCaseFail()396 public void stringEqualityIgnoringCaseFail() { 397 expectFailureWhenTestingThat("abc").ignoringCase().isEqualTo("abd"); 398 399 assertFailureValue("expected", "abd"); 400 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 401 } 402 403 @Test stringEqualityIgnoringCaseFailWithNullSubject()404 public void stringEqualityIgnoringCaseFailWithNullSubject() { 405 expectFailureWhenTestingThat((String) null).ignoringCase().isEqualTo("abc"); 406 407 assertFailureValue("expected a string that is equal to", "abc"); 408 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 409 } 410 411 @Test stringEqualityIgnoringCaseFailWithNullExpectedString()412 public void stringEqualityIgnoringCaseFailWithNullExpectedString() { 413 expectFailureWhenTestingThat("abc").ignoringCase().isEqualTo(null); 414 415 assertFailureValue("expected", "null (null reference)"); 416 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 417 } 418 419 @Test stringInequalityIgnoringCase()420 public void stringInequalityIgnoringCase() { 421 assertThat("café").ignoringCase().isNotEqualTo("AFÉ"); 422 } 423 424 @Test stringInequalityIgnoringCaseWithNullSubject()425 public void stringInequalityIgnoringCaseWithNullSubject() { 426 assertThat((String) null).ignoringCase().isNotEqualTo("abc"); 427 } 428 429 @Test stringInequalityIgnoringCaseWithNullExpectedString()430 public void stringInequalityIgnoringCaseWithNullExpectedString() { 431 assertThat("abc").ignoringCase().isNotEqualTo(null); 432 } 433 434 @Test stringInequalityIgnoringCaseFail()435 public void stringInequalityIgnoringCaseFail() { 436 expectFailureWhenTestingThat("café").ignoringCase().isNotEqualTo("CAFÉ"); 437 438 assertFailureValue("expected not to be", "CAFÉ"); 439 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 440 } 441 442 @Test stringInequalityIgnoringCaseFailWithNullSubject()443 public void stringInequalityIgnoringCaseFailWithNullSubject() { 444 expectFailureWhenTestingThat((String) null).ignoringCase().isNotEqualTo(null); 445 446 assertFailureValue("expected a string that is not equal to", "null (null reference)"); 447 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 448 } 449 450 @Test stringContainsIgnoringCase()451 public void stringContainsIgnoringCase() { 452 assertThat("äbc").ignoringCase().contains("Ä"); 453 } 454 455 @Test stringContainsIgnoringCaseEmptyString()456 public void stringContainsIgnoringCaseEmptyString() { 457 assertThat("abc").ignoringCase().contains(""); 458 } 459 460 @Test stringContainsIgnoringCaseWithWord()461 public void stringContainsIgnoringCaseWithWord() { 462 assertThat("abcdé").ignoringCase().contains("CdÉ"); 463 } 464 465 @Test stringContainsIgnoringCaseWholeWord()466 public void stringContainsIgnoringCaseWholeWord() { 467 assertThat("abcde").ignoringCase().contains("ABCde"); 468 } 469 470 @Test stringContainsIgnoringCaseCharSeq()471 public void stringContainsIgnoringCaseCharSeq() { 472 CharSequence charSeq = new StringBuilder("C"); 473 assertThat("abc").ignoringCase().contains(charSeq); 474 } 475 476 @Test stringContainsIgnoringCaseFail()477 public void stringContainsIgnoringCaseFail() { 478 expectFailureWhenTestingThat("abc").ignoringCase().contains("d"); 479 480 assertFailureValue("expected to contain", "d"); 481 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 482 } 483 484 @Test stringContainsIgnoringCaseFailBecauseTooLarge()485 public void stringContainsIgnoringCaseFailBecauseTooLarge() { 486 expectFailureWhenTestingThat("abc").ignoringCase().contains("abcc"); 487 488 assertFailureValue("expected to contain", "abcc"); 489 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 490 } 491 492 @Test stringContainsIgnoringCaseFailBecauseNullSubject()493 public void stringContainsIgnoringCaseFailBecauseNullSubject() { 494 expectFailureWhenTestingThat((String) null).ignoringCase().contains("d"); 495 496 assertFailureValue("expected a string that contains", "d"); 497 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 498 } 499 500 @Test stringDoesNotContainIgnoringCase()501 public void stringDoesNotContainIgnoringCase() { 502 assertThat("äbc").ignoringCase().doesNotContain("Äc"); 503 } 504 505 @Test stringDoesNotContainIgnoringCaseCharSeq()506 public void stringDoesNotContainIgnoringCaseCharSeq() { 507 CharSequence charSeq = new StringBuilder("cb"); 508 assertThat("abc").ignoringCase().doesNotContain(charSeq); 509 } 510 511 @Test stringDoesNotContainIgnoringCaseFail()512 public void stringDoesNotContainIgnoringCaseFail() { 513 expectFailureWhenTestingThat("äbc").ignoringCase().doesNotContain("Äb"); 514 515 assertFailureValue("expected not to contain", "Äb"); 516 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 517 } 518 519 @Test stringDoesNotContainIgnoringCaseFailWithEmptyString()520 public void stringDoesNotContainIgnoringCaseFailWithEmptyString() { 521 expectFailureWhenTestingThat("abc").ignoringCase().doesNotContain(""); 522 523 assertFailureValue("expected not to contain", ""); 524 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 525 } 526 527 @Test stringDoesNotContainIgnoringCaseFailBecauseNullSubject()528 public void stringDoesNotContainIgnoringCaseFailBecauseNullSubject() { 529 expectFailureWhenTestingThat((String) null).ignoringCase().doesNotContain("d"); 530 531 assertFailureValue("expected a string that does not contain", "d"); 532 assertThat(expectFailure.getFailure()).factKeys().contains("(case is ignored)"); 533 } 534 535 @Test trailingWhitespaceInActual()536 public void trailingWhitespaceInActual() { 537 expectFailureWhenTestingThat("foo\n").isEqualTo("foo"); 538 assertFailureKeys("expected", "but contained extra trailing whitespace"); 539 assertFailureValue("but contained extra trailing whitespace", "\\n"); 540 } 541 542 @Test trailingWhitespaceInExpected()543 public void trailingWhitespaceInExpected() { 544 expectFailureWhenTestingThat("foo").isEqualTo("foo "); 545 assertFailureKeys("expected", "but was missing trailing whitespace"); 546 assertFailureValue("but was missing trailing whitespace", "␣"); 547 } 548 549 @Test trailingWhitespaceInBoth()550 public void trailingWhitespaceInBoth() { 551 expectFailureWhenTestingThat("foo \n").isEqualTo("foo\u00a0"); 552 assertFailureKeys("expected", "with trailing whitespace", "but trailing whitespace was"); 553 assertFailureValue("with trailing whitespace", "\\u00a0"); 554 assertFailureValue("but trailing whitespace was", "␣\\n"); 555 } 556 557 @Test trailingWhitespaceVsEmptyString()558 public void trailingWhitespaceVsEmptyString() { 559 /* 560 * The code has special cases for both trailing whitespace and an empty string. Make sure that 561 * it specifically reports the trailing whitespace. (It might be nice to *also* report the empty 562 * string specially, but that's less important.) 563 */ 564 expectFailureWhenTestingThat("\t").isEqualTo(""); 565 assertFailureKeys("expected", "but contained extra trailing whitespace"); 566 assertFailureValue("but contained extra trailing whitespace", "\\t"); 567 } 568 expectFailureWhenTestingThat(String actual)569 private StringSubject expectFailureWhenTestingThat(String actual) { 570 return expectFailure.whenTesting().that(actual); 571 } 572 } 573