/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * 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 android.text.style.cts;

import static org.junit.Assert.assertEquals;

import android.os.Parcel;
import android.os.PersistableBundle;
import android.text.style.TtsSpan;

import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@SmallTest
@RunWith(AndroidJUnit4.class)
public class TtsSpanTest {
    private PersistableBundle mBundle;

    @Before
    public void setup() {
        mBundle = new PersistableBundle();
        mBundle.putString("argument.one", "value.one");
        mBundle.putString("argument.two", "value.two");
        mBundle.putLong("argument.three", 3);
        mBundle.putLong("argument.four", 4);
    }

    @Test
    public void testGetArgs() {
        TtsSpan t = new TtsSpan("test.type.one", mBundle);
        final PersistableBundle args = t.getArgs();
        assertEquals(4, args.size());
        assertEquals("value.one", args.getString("argument.one"));
        assertEquals("value.two", args.getString("argument.two"));
        assertEquals(3, args.getLong("argument.three"));
        assertEquals(4, args.getLong("argument.four"));
    }

    @Test
    public void testGetType() {
        TtsSpan t = new TtsSpan("test.type.two", mBundle);
        assertEquals("test.type.two", t.getType());
    }

    @Test
    public void testDescribeContents() {
        TtsSpan span = new TtsSpan("test.type.three", mBundle);
        span.describeContents();
    }

    @Test
    public void testGetSpanTypeId() {
        TtsSpan span = new TtsSpan("test.type.four", mBundle);
        span.getSpanTypeId();
    }

    @Test
    public void testWriteAndReadParcel() {
        Parcel p = Parcel.obtain();
        try {
            TtsSpan span = new TtsSpan("test.type.five", mBundle);
            span.writeToParcel(p, 0);
            p.setDataPosition(0);

            TtsSpan t = new TtsSpan(p);

            assertEquals("test.type.five", t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(4, args.size());
            assertEquals("value.one", args.getString("argument.one"));
            assertEquals("value.two", args.getString("argument.two"));
            assertEquals(3, args.getLong("argument.three"));
            assertEquals(4, args.getLong("argument.four"));
        } finally {
            p.recycle();
        }
    }

    @Test
    public void testBuilder() {
        final TtsSpan t = new TtsSpan.Builder<>("test.type.builder")
                .setStringArgument("argument.string", "value")
                .setIntArgument("argument.int", Integer.MAX_VALUE)
                .setLongArgument("argument.long", Long.MAX_VALUE)
                .build();
        assertEquals("test.type.builder", t.getType());
        final PersistableBundle args = t.getArgs();
        assertEquals(3, args.size());
        assertEquals("value", args.getString("argument.string"));
        assertEquals(Integer.MAX_VALUE, args.getInt("argument.int"));
        assertEquals(Long.MAX_VALUE, args.getLong("argument.long"));
    }

    @Test
    public void testSemioticClassBuilder() {
        final TtsSpan t = new TtsSpan.SemioticClassBuilder<>("test.type.semioticClassBuilder")
                .setGender(TtsSpan.GENDER_FEMALE)
                .setAnimacy(TtsSpan.ANIMACY_ANIMATE)
                .setMultiplicity(TtsSpan.MULTIPLICITY_SINGLE)
                .setCase(TtsSpan.CASE_NOMINATIVE)
                .build();
        assertEquals("test.type.semioticClassBuilder", t.getType());
        final PersistableBundle args = t.getArgs();
        assertEquals(4, args.size());
        assertEquals(TtsSpan.GENDER_FEMALE, args.getString(TtsSpan.ARG_GENDER));
        assertEquals(TtsSpan.ANIMACY_ANIMATE, args.getString(TtsSpan.ARG_ANIMACY));
        assertEquals(TtsSpan.MULTIPLICITY_SINGLE, args.getString(TtsSpan.ARG_MULTIPLICITY));
        assertEquals(TtsSpan.CASE_NOMINATIVE, args.getString(TtsSpan.ARG_CASE));
    }

    @Test
    public void testTextBuilder() {
        {
            final TtsSpan t = new TtsSpan.TextBuilder()
                    .setText("text")
                    .build();
            assertEquals(TtsSpan.TYPE_TEXT, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("text", args.getString(TtsSpan.ARG_TEXT));
        }
        {
            final TtsSpan t = new TtsSpan.TextBuilder("text").build();
            assertEquals(TtsSpan.TYPE_TEXT, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("text", args.getString(TtsSpan.ARG_TEXT));
        }
    }

    @Test
    public void testCardinalBuilder() {
        {
            final TtsSpan t = new TtsSpan.CardinalBuilder()
                    .setNumber(Long.MAX_VALUE)
                    .build();
            assertEquals(TtsSpan.TYPE_CARDINAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals(String.valueOf(Long.MAX_VALUE), args.getString(TtsSpan.ARG_NUMBER));
        }
        {
            final TtsSpan t = new TtsSpan.CardinalBuilder()
                    .setNumber("10")
                    .build();
            assertEquals(TtsSpan.TYPE_CARDINAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_NUMBER));
        }
        {
            final TtsSpan t = new TtsSpan.CardinalBuilder(Long.MAX_VALUE).build();
            assertEquals(TtsSpan.TYPE_CARDINAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals(String.valueOf(Long.MAX_VALUE), args.getString(TtsSpan.ARG_NUMBER));
        }
        {
            final TtsSpan t = new TtsSpan.CardinalBuilder("10").build();
            assertEquals(TtsSpan.TYPE_CARDINAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_NUMBER));
        }
    }

    @Test
    public void testOrdinalBuilder() {
        {
            final TtsSpan t = new TtsSpan.OrdinalBuilder()
                    .setNumber(Long.MAX_VALUE)
                    .build();
            assertEquals(TtsSpan.TYPE_ORDINAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals(String.valueOf(Long.MAX_VALUE), args.getString(TtsSpan.ARG_NUMBER));
        }
        {
            final TtsSpan t = new TtsSpan.OrdinalBuilder()
                    .setNumber("10")
                    .build();
            assertEquals(TtsSpan.TYPE_ORDINAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_NUMBER));
        }
        {
            final TtsSpan t = new TtsSpan.OrdinalBuilder(Long.MAX_VALUE).build();
            assertEquals(TtsSpan.TYPE_ORDINAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals(String.valueOf(Long.MAX_VALUE), args.getString(TtsSpan.ARG_NUMBER));
        }
        {
            final TtsSpan t = new TtsSpan.OrdinalBuilder("10").build();
            assertEquals(TtsSpan.TYPE_ORDINAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_NUMBER));
        }
    }

    @Test
    public void testDecimalBuilder() {
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder()
                    .setArgumentsFromDouble(10.25, 1, 2)
                    .build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals("25", args.getString(TtsSpan.ARG_FRACTIONAL_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder(10.25, 1, 2).build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals("25", args.getString(TtsSpan.ARG_FRACTIONAL_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder()
                    .setArgumentsFromDouble(10, 0, 0)
                    .build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder(10, 0, 0).build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder()
                    .setArgumentsFromDouble(10.25, 10, 10)
                    .build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals("2500000000", args.getString(TtsSpan.ARG_FRACTIONAL_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder("10", "25").build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals("25", args.getString(TtsSpan.ARG_FRACTIONAL_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder(null, null).build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals(null, args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals(null, args.getString(TtsSpan.ARG_FRACTIONAL_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder().setIntegerPart(10).build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder().setIntegerPart("10").build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder().setIntegerPart(null).build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals(null, args.getString(TtsSpan.ARG_INTEGER_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder().setFractionalPart("25").build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("25", args.getString(TtsSpan.ARG_FRACTIONAL_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder().setFractionalPart(null).build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals(null, args.getString(TtsSpan.ARG_FRACTIONAL_PART));
        }
        {
            final TtsSpan t = new TtsSpan.DecimalBuilder().build();
            assertEquals(TtsSpan.TYPE_DECIMAL, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(0, args.size());
        }
    }

    @Test
    public void testFractionBuilder() {
        {
            final TtsSpan t = new TtsSpan.FractionBuilder()
                    .setIntegerPart(10)
                    .setNumerator(3)
                    .setDenominator(100)
                    .build();
            assertEquals(TtsSpan.TYPE_FRACTION, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(3, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals("3", args.getString(TtsSpan.ARG_NUMERATOR));
            assertEquals("100", args.getString(TtsSpan.ARG_DENOMINATOR));
        }
        {
            final TtsSpan t = new TtsSpan.FractionBuilder(10, 3, 100).build();
            assertEquals(TtsSpan.TYPE_FRACTION, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(3, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals("3", args.getString(TtsSpan.ARG_NUMERATOR));
            assertEquals("100", args.getString(TtsSpan.ARG_DENOMINATOR));
        }
        {
            final TtsSpan t = new TtsSpan.FractionBuilder().setIntegerPart("10").build();
            assertEquals(TtsSpan.TYPE_FRACTION, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals(null, args.getString(TtsSpan.ARG_NUMERATOR));
            assertEquals(null, args.getString(TtsSpan.ARG_DENOMINATOR));
        }
        {
            final TtsSpan t = new TtsSpan.FractionBuilder().setNumerator("3").build();
            assertEquals(TtsSpan.TYPE_FRACTION, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("3", args.getString(TtsSpan.ARG_NUMERATOR));
        }
        {
            final TtsSpan t = new TtsSpan.FractionBuilder().setDenominator("100").build();
            assertEquals(TtsSpan.TYPE_FRACTION, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("100", args.getString(TtsSpan.ARG_DENOMINATOR));
        }
        {
            final TtsSpan t = new TtsSpan.FractionBuilder().build();
            assertEquals(TtsSpan.TYPE_FRACTION, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(0, args.size());
        }
    }

    @Test
    public void testMeasureBuilder() {
        {
            final TtsSpan t = new TtsSpan.MeasureBuilder()
                    .setNumber(10)
                    .setUnit("unit")
                    .build();
            assertEquals(TtsSpan.TYPE_MEASURE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_NUMBER));
            assertEquals("unit", args.getString(TtsSpan.ARG_UNIT));
        }
        {
            final TtsSpan t = new TtsSpan.MeasureBuilder()
                    .setIntegerPart(10)
                    .setFractionalPart("25")
                    .setUnit("unit")
                    .build();
            assertEquals(TtsSpan.TYPE_MEASURE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(3, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals("25", args.getString(TtsSpan.ARG_FRACTIONAL_PART));
            assertEquals("unit", args.getString(TtsSpan.ARG_UNIT));
        }
        {
            final TtsSpan t = new TtsSpan.MeasureBuilder()
                    .setIntegerPart(10)
                    .setNumerator(3)
                    .setDenominator(100)
                    .setUnit("unit")
                    .build();
            assertEquals(TtsSpan.TYPE_MEASURE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(4, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals("3", args.getString(TtsSpan.ARG_NUMERATOR));
            assertEquals("100", args.getString(TtsSpan.ARG_DENOMINATOR));
            assertEquals("unit", args.getString(TtsSpan.ARG_UNIT));
        }
        {
            final TtsSpan t = new TtsSpan.MeasureBuilder().setIntegerPart("10").build();
            assertEquals(TtsSpan.TYPE_MEASURE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
        }
        {
            final TtsSpan t = new TtsSpan.MeasureBuilder().setNumerator("3").build();
            assertEquals(TtsSpan.TYPE_MEASURE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("3", args.getString(TtsSpan.ARG_NUMERATOR));
        }
        {
            final TtsSpan t = new TtsSpan.MeasureBuilder().setDenominator("100").build();
            assertEquals(TtsSpan.TYPE_MEASURE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("100", args.getString(TtsSpan.ARG_DENOMINATOR));
        }
        {
            final TtsSpan t = new TtsSpan.MeasureBuilder().build();
            assertEquals(TtsSpan.TYPE_MEASURE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(0, args.size());
        }
    }

    @Test
    public void testTimeBuilder() {
        {
            final TtsSpan t = new TtsSpan.TimeBuilder()
                    .setHours(20)
                    .setMinutes(50)
                    .build();
            assertEquals(TtsSpan.TYPE_TIME, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals(20, args.getInt(TtsSpan.ARG_HOURS));
            assertEquals(50, args.getInt(TtsSpan.ARG_MINUTES));
        }
        {
            final TtsSpan t = new TtsSpan.TimeBuilder(20, 50).build();
            assertEquals(TtsSpan.TYPE_TIME, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals(20, args.getInt(TtsSpan.ARG_HOURS));
            assertEquals(50, args.getInt(TtsSpan.ARG_MINUTES));
        }
    }

    @Test
    public void testDateBuilder() {
        {
            final TtsSpan t = new TtsSpan.DateBuilder()
                    .setWeekday(3)
                    .setDay(16)
                    .setMonth(3)
                    .setYear(2016)
                    .build();
            assertEquals(TtsSpan.TYPE_DATE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(4, args.size());
            assertEquals(3, args.getInt(TtsSpan.ARG_WEEKDAY));
            assertEquals(16, args.getInt(TtsSpan.ARG_DAY));
            assertEquals(3, args.getInt(TtsSpan.ARG_MONTH));
            assertEquals(2016, args.getInt(TtsSpan.ARG_YEAR));
        }
        {
            final TtsSpan t = new TtsSpan.DateBuilder(3, 16, 3, 2016).build();
            assertEquals(TtsSpan.TYPE_DATE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(4, args.size());
            assertEquals(3, args.getInt(TtsSpan.ARG_WEEKDAY));
            assertEquals(16, args.getInt(TtsSpan.ARG_DAY));
            assertEquals(3, args.getInt(TtsSpan.ARG_MONTH));
            assertEquals(2016, args.getInt(TtsSpan.ARG_YEAR));
        }
        {
            final TtsSpan t = new TtsSpan.DateBuilder(3, 16, null, null).build();
            assertEquals(TtsSpan.TYPE_DATE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals(3, args.getInt(TtsSpan.ARG_WEEKDAY));
            assertEquals(16, args.getInt(TtsSpan.ARG_DAY));
        }
    }

    @Test
    public void testMoneyBuilder() {
        {
            final TtsSpan t = new TtsSpan.MoneyBuilder()
                    .setIntegerPart(10)
                    .setFractionalPart("25")
                    .setCurrency("USD")
                    .setQuantity("1000")
                    .build();
            assertEquals(TtsSpan.TYPE_MONEY, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(4, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
            assertEquals("25", args.getString(TtsSpan.ARG_FRACTIONAL_PART));
            assertEquals("USD", args.getString(TtsSpan.ARG_CURRENCY));
            assertEquals("1000", args.getString(TtsSpan.ARG_QUANTITY));
        }
        {
            final TtsSpan t = new TtsSpan.MoneyBuilder().setIntegerPart("10").build();
            assertEquals(TtsSpan.TYPE_MONEY, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("10", args.getString(TtsSpan.ARG_INTEGER_PART));
        }
        {
            final TtsSpan t = new TtsSpan.MoneyBuilder().build();
            assertEquals(TtsSpan.TYPE_MONEY, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(0, args.size());
        }

    }

    @Test
    public void testTelephoneBuilder() {
        {
            final TtsSpan t = new TtsSpan.TelephoneBuilder()
                    .setCountryCode("+01")
                    .setNumberParts("000-000-0000")
                    .setExtension("0000")
                    .build();
            assertEquals(TtsSpan.TYPE_TELEPHONE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(3, args.size());
            assertEquals("+01", args.getString(TtsSpan.ARG_COUNTRY_CODE));
            assertEquals("000-000-0000", args.getString(TtsSpan.ARG_NUMBER_PARTS));
            assertEquals("0000", args.getString(TtsSpan.ARG_EXTENSION));
        }
        {
            final TtsSpan t = new TtsSpan.TelephoneBuilder("000-000-0000").build();
            assertEquals(TtsSpan.TYPE_TELEPHONE, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("000-000-0000", args.getString(TtsSpan.ARG_NUMBER_PARTS));
        }
    }

    @Test
    public void testElectronicBuilder() {
        {
            final TtsSpan t = new TtsSpan.ElectronicBuilder()
                    .setEmailArguments("example", "example.com")
                    .build();
            assertEquals(TtsSpan.TYPE_ELECTRONIC, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(2, args.size());
            assertEquals("example", args.getString(TtsSpan.ARG_USERNAME));
            assertEquals("example.com", args.getString(TtsSpan.ARG_DOMAIN));
        }
        {
            final TtsSpan t = new TtsSpan.ElectronicBuilder()
                    .setProtocol("http")
                    .setDomain("example.com")
                    .setPort(80)
                    .setPath("example/index.html")
                    .setQueryString("arg1=value1&arg2=value2")
                    .setFragmentId("fragment")
                    .setUsername("username")
                    .setPassword("password")
                    .build();
            assertEquals(TtsSpan.TYPE_ELECTRONIC, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(8, args.size());
            assertEquals("http", args.getString(TtsSpan.ARG_PROTOCOL));
            assertEquals("example.com", args.getString(TtsSpan.ARG_DOMAIN));
            assertEquals(80, args.getInt(TtsSpan.ARG_PORT));
            assertEquals("example/index.html", args.getString(TtsSpan.ARG_PATH));
            assertEquals("arg1=value1&arg2=value2", args.getString(TtsSpan.ARG_QUERY_STRING));
            assertEquals("fragment", args.getString(TtsSpan.ARG_FRAGMENT_ID));
            assertEquals("username", args.getString(TtsSpan.ARG_USERNAME));
            assertEquals("password", args.getString(TtsSpan.ARG_PASSWORD));
        }
    }

    @Test
    public void testDigitsBuilder() {
        {
            final TtsSpan t = new TtsSpan.DigitsBuilder()
                    .setDigits("12345")
                    .build();
            assertEquals(TtsSpan.TYPE_DIGITS, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("12345", args.getString(TtsSpan.ARG_DIGITS));
        }
        {
            final TtsSpan t = new TtsSpan.DigitsBuilder("12345").build();
            assertEquals(TtsSpan.TYPE_DIGITS, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("12345", args.getString(TtsSpan.ARG_DIGITS));
        }
    }

    @Test
    public void testVerbatimBuilder() {
        {
            final TtsSpan t = new TtsSpan.VerbatimBuilder()
                    .setVerbatim("abcdefg")
                    .build();
            assertEquals(TtsSpan.TYPE_VERBATIM, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("abcdefg", args.getString(TtsSpan.ARG_VERBATIM));
        }
        {
            final TtsSpan t = new TtsSpan.VerbatimBuilder("abcdefg").build();
            assertEquals(TtsSpan.TYPE_VERBATIM, t.getType());
            final PersistableBundle args = t.getArgs();
            assertEquals(1, args.size());
            assertEquals("abcdefg", args.getString(TtsSpan.ARG_VERBATIM));
        }
    }
}
