xref: /aosp_15_r20/external/truth/core/src/test/java/com/google/common/truth/StringSubjectTest.java (revision b3996a89512f34bffd8f9a69f0bc726f1b19016a)
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