blob: de67c17357a0ed8768b50113cc39e797aa2dcfd9 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.ui.text;
import android.text.SpannableString;
import android.text.style.BulletSpan;
import android.text.style.QuoteSpan;
import android.text.style.ScaleXSpan;
import org.chromium.testing.local.LocalRobolectricTestRunner;
import org.chromium.ui.text.SpanApplier.SpanInfo;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
/**
* Tests public methods in SpanApplier.
*/
@RunWith(LocalRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class SpanApplierTest {
@Test
public void testApplySpan() {
String input = "Lorem ipsum <span>dolor</span> sit amet.";
String output = "Lorem ipsum dolor sit amet.";
SpanInfo span = new SpanInfo("<span>", "</span>", new QuoteSpan());
SpannableString expectedOutput = new SpannableString(output);
expectedOutput.setSpan(span.mSpan, 12, 17, 0);
SpannableString actualOutput = SpanApplier.applySpans(input, span);
assertSpannableStringEquality(expectedOutput, actualOutput);
}
@Test
public void testApplyMultipleSpans() {
String input = "Lorem <link>ipsum</link> dolor sit amet, "
+ "<cons>consectetur adipiscing</cons> <elit>elit. Proin<endElit> consectetur.";
String output = "Lorem ipsum dolor sit amet, "
+ "consectetur adipiscing elit. Proin consectetur.";
SpanInfo linkSpan = new SpanInfo("<link>", "</link>", new QuoteSpan());
SpanInfo consSpan = new SpanInfo("<cons>", "</cons>", new BulletSpan());
SpanInfo elitSpan = new SpanInfo("<elit>", "<endElit>", new ScaleXSpan(1));
SpannableString expectedOutput = new SpannableString(output);
expectedOutput.setSpan(linkSpan.mSpan, 6, 11, 0);
expectedOutput.setSpan(consSpan.mSpan, 28, 50, 0);
expectedOutput.setSpan(elitSpan.mSpan, 51, 62, 0);
SpannableString actualOutput = SpanApplier.applySpans(input, elitSpan, consSpan, linkSpan);
assertSpannableStringEquality(expectedOutput, actualOutput);
}
@Test
public void testEndTagMissingInInput() {
String input = "Lorem ipsum <span>dolor</> sit amet.";
SpanInfo span = new SpanInfo("<span>", "</span>", new QuoteSpan());
try {
SpanApplier.applySpans(input, span);
Assert.fail("Expected IllegalArgumentException to be thrown.");
} catch (IllegalArgumentException e) {
// success
}
}
@Test
public void testStartTagMissingInInput() {
String input = "Lorem ipsum <>dolor</span> sit amet.";
SpanInfo span = new SpanInfo("<span>", "</span>", new QuoteSpan());
try {
SpanApplier.applySpans(input, span);
Assert.fail("Expected IllegalArgumentException to be thrown.");
} catch (IllegalArgumentException e) {
// success
}
}
@Test
public void testNestedTagsInInput() {
String input = "Lorem ipsum <span>dolor<span2> sit </span2> </span> amet.";
SpanInfo span = new SpanInfo("<span>", "</span>", new QuoteSpan());
SpanInfo span2 = new SpanInfo("<span2>", "</span2>", new QuoteSpan());
try {
SpanApplier.applySpans(input, span, span2);
Assert.fail("Expected IllegalArgumentException to be thrown.");
} catch (IllegalArgumentException e) {
// success
}
}
@Test
public void testDuplicateTagsInInput() {
String input = "Lorem ipsum <span>dolor</span> <span>sit </span> amet.";
SpanInfo span = new SpanInfo("<span>", "</span>", new QuoteSpan());
SpanInfo span2 = new SpanInfo("<span>", "</span>", new QuoteSpan());
try {
SpanApplier.applySpans(input, span, span2);
Assert.fail("Expected IllegalArgumentException to be thrown.");
} catch (IllegalArgumentException e) {
// success
}
}
/*
* Tests the attributes of two SpannableStrings and asserts expected equality.
*
* Prior to KitKat, there was no equals method for SpannableString, so we have to
* manually check that the objects are the same.
*/
private void assertSpannableStringEquality(
SpannableString expected, SpannableString actual) {
if (!areSpannableStringsEqual(expected, actual)) {
Assert.fail("Expected string is " + getSpannableStringDescription(expected)
+ " Actual string is " + getSpannableStringDescription(actual));
}
}
private boolean areSpannableStringsEqual(SpannableString expected, SpannableString actual) {
Object[] expectedSpans = expected.getSpans(0, expected.length(), Object.class);
Object[] actualSpans = actual.getSpans(0, actual.length(), Object.class);
if (!expected.toString().equals(actual.toString())
|| expectedSpans.length != actualSpans.length) {
return false;
}
for (int i = 0; i < expectedSpans.length; i++) {
Object expectedSpan = expectedSpans[i];
Object actualSpan = actualSpans[i];
if (expectedSpan != actualSpan
|| expected.getSpanStart(expectedSpan) != actual.getSpanStart(actualSpan)
|| expected.getSpanEnd(expectedSpan) != actual.getSpanEnd(actualSpan)) {
return false;
}
}
return true;
}
private String getSpannableStringDescription(SpannableString spannableString) {
Object[] spans = spannableString.getSpans(0, spannableString.length(), Object.class);
StringBuilder description = new StringBuilder();
description.append("\"" + spannableString + "\"" + " with spans: ");
for (int i = 0; i < spans.length; i++) {
Object span = spans[i];
description.append(span.getClass().getName()
+ " from " + spannableString.getSpanStart(span)
+ " to " + spannableString.getSpanEnd(span));
if (i != spans.length - 1) {
description.append(", ");
}
}
description.append('.');
return description.toString();
}
}