16ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt/*
26ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Copyright (C) 2010 The Android Open Source Project
36ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt *
46ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Licensed under the Apache License, Version 2.0 (the "License"); you may not
56ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * use this file except in compliance with the License. You may obtain a copy of
66ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * the License at
76ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt *
86ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * http://www.apache.org/licenses/LICENSE-2.0
96ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt *
106ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Unless required by applicable law or agreed to in writing, software
116ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
126ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
136ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * License for the specific language governing permissions and limitations under
146ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * the License.
156ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */
166ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
176ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltpackage android.text;
186ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
196ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport android.graphics.Paint.FontMetricsInt;
206ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport android.test.suitebuilder.annotation.SmallTest;
216ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport android.text.Layout.Alignment;
226ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport static android.text.Layout.Alignment.*;
236ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport android.util.Log;
246ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
256ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport junit.framework.TestCase;
266ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
276ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt/**
286ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Tests StaticLayout vertical metrics behavior.
2908209a767b7d960f5396df3aa45913b2194c46beDoug Felt *
3008209a767b7d960f5396df3aa45913b2194c46beDoug Felt * Requires disabling access checks in the vm since this calls package-private
3108209a767b7d960f5396df3aa45913b2194c46beDoug Felt * APIs.
3208209a767b7d960f5396df3aa45913b2194c46beDoug Felt *
3308209a767b7d960f5396df3aa45913b2194c46beDoug Felt * @Suppress
346ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */
356ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltpublic class StaticLayoutTest extends TestCase {
366ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
376ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    /**
386ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Basic test showing expected behavior and relationship between font
396ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * metrics and line metrics.
406ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     */
4108209a767b7d960f5396df3aa45913b2194c46beDoug Felt    //@SmallTest
426ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    public void testGetters1() {
436ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder b = builder();
446ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        FontMetricsInt fmi = b.paint.getFontMetricsInt();
456ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
466ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        // check default paint
476ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Log.i("TG1:paint", fmi.toString());
486ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
496ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Layout l = b.build();
506ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertVertMetrics(l, 0, 0,
516ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.descent);
526ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
536ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        // other quick metrics
546ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(0, l.getLineStart(0));
556ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(Layout.DIR_LEFT_TO_RIGHT, l.getParagraphDirection(0));
566ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(false, l.getLineContainsTab(0));
576ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(Layout.DIRS_ALL_LEFT_TO_RIGHT, l.getLineDirections(0));
586ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(0, l.getEllipsisCount(0));
596ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(0, l.getEllipsisStart(0));
606ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(b.width, l.getEllipsizedWidth());
616ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
626ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
636ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    /**
646ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Basic test showing effect of includePad = true with 1 line.
656ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Top and bottom padding are affected, as is the line descent and height.
666ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     */
6708209a767b7d960f5396df3aa45913b2194c46beDoug Felt    //@SmallTest
686ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    public void testGetters2() {
696ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder b = builder()
706ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setIncludePad(true);
716ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        FontMetricsInt fmi = b.paint.getFontMetricsInt();
726ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
736ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Layout l = b.build();
746ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent,
756ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.top, fmi.bottom);
766ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
776ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
786ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    /**
796ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Basic test showing effect of includePad = true wrapping to 2 lines.
806ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Ascent of top line and descent of bottom line are affected.
816ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     */
8208209a767b7d960f5396df3aa45913b2194c46beDoug Felt    //@SmallTest
836ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    public void testGetters3() {
846ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder b = builder()
856ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setIncludePad(true)
866ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setWidth(50);
876ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        FontMetricsInt fmi = b.paint.getFontMetricsInt();
886ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
896ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Layout l =  b.build();
906ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent,
916ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            fmi.top, fmi.descent,
926ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            fmi.ascent, fmi.bottom);
936ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
946ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
956ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    /**
966ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Basic test showing effect of includePad = true wrapping to 3 lines.
976ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * First line ascent is top, bottom line descent is bottom.
986ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     */
9908209a767b7d960f5396df3aa45913b2194c46beDoug Felt    //@SmallTest
1006ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    public void testGetters4() {
1016ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder b = builder()
1026ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setText("This is a longer test")
1036ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setIncludePad(true)
1046ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setWidth(50);
1056ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        FontMetricsInt fmi = b.paint.getFontMetricsInt();
1066ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
1076ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Layout l = b.build();
1086ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent,
1096ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.top, fmi.descent,
1106ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.descent,
1116ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.bottom);
1126ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
1136ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
1146ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    /**
1156ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Basic test showing effect of includePad = true wrapping to 3 lines and
1166ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * large text. See effect of leading. Currently, we don't expect there to
1176ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * even be non-zero leading.
1186ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     */
11908209a767b7d960f5396df3aa45913b2194c46beDoug Felt    //@SmallTest
1206ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    public void testGetters5() {
1216ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder b = builder()
1226ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setText("This is a longer test")
1236ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setIncludePad(true)
1246ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setWidth(150);
1256ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        b.paint.setTextSize(36);
1266ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        FontMetricsInt fmi = b.paint.getFontMetricsInt();
1276ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
1286ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        if (fmi.leading == 0) { // nothing to test
1296ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            Log.i("TG5", "leading is 0, skipping test");
1306ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            return;
1316ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
1326ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
1336ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        // So far, leading is not used, so this is the same as TG4.  If we start
1346ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        // using leading, this will fail.
1356ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Layout l = b.build();
1366ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent,
1376ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.top, fmi.descent,
1386ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.descent,
1396ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.bottom);
1406ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
1416ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
1426ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    /**
1436ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Basic test showing effect of includePad = true, spacingAdd = 2, wrapping
1446ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * to 3 lines.
1456ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     */
14608209a767b7d960f5396df3aa45913b2194c46beDoug Felt    //@SmallTest
1476ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    public void testGetters6() {
1486ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        int spacingAdd = 2; // int so expressions return int
1496ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder b = builder()
1506ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setText("This is a longer test")
1516ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setIncludePad(true)
1526ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setWidth(50)
1536ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setSpacingAdd(spacingAdd);
1546ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        FontMetricsInt fmi = b.paint.getFontMetricsInt();
1556ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
1566ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Layout l = b.build();
1576ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent,
1586ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.top, fmi.descent + spacingAdd,
1596ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.descent + spacingAdd,
1606ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.bottom + spacingAdd);
1616ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
1626ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
1636ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    /**
1646ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Basic test showing effect of includePad = true, spacingAdd = 2,
1656ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * spacingMult = 1.5, wrapping to 3 lines.
1666ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     */
16708209a767b7d960f5396df3aa45913b2194c46beDoug Felt    //@SmallTest
1686ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    public void testGetters7() {
1696ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder b = builder()
1706ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setText("This is a longer test")
1716ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setIncludePad(true)
1726ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setWidth(50)
1736ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setSpacingAdd(2)
1746ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setSpacingMult(1.5f);
1756ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        FontMetricsInt fmi = b.paint.getFontMetricsInt();
1766ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Scaler s = new Scaler(b.spacingMult, b.spacingAdd);
1776ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
1786ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Layout l = b.build();
1796ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent,
1806ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.top, fmi.descent + s.scale(fmi.descent - fmi.top),
1816ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.descent + s.scale(fmi.descent - fmi.ascent),
1826ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.bottom + s.scale(fmi.bottom - fmi.ascent));
1836ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
1846ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
1856ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    /**
1866ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * Basic test showing effect of includePad = true, spacingAdd = 0,
1876ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     * spacingMult = 0.8 when wrapping to 3 lines.
1886ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt     */
18908209a767b7d960f5396df3aa45913b2194c46beDoug Felt    //@SmallTest
1906ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    public void testGetters8() {
1916ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder b = builder()
1926ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setText("This is a longer test")
1936ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setIncludePad(true)
1946ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setWidth(50)
1956ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setSpacingAdd(2)
1966ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            .setSpacingMult(.8f);
1976ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        FontMetricsInt fmi = b.paint.getFontMetricsInt();
1986ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Scaler s = new Scaler(b.spacingMult, b.spacingAdd);
1996ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2006ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Layout l = b.build();
2016ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent,
2026ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.top, fmi.descent + s.scale(fmi.descent - fmi.top),
2036ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.descent + s.scale(fmi.descent - fmi.ascent),
2046ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                fmi.ascent, fmi.bottom + s.scale(fmi.bottom - fmi.ascent));
2056ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
2066ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2076ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    // ----- test utility classes and methods -----
2086ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2096ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    // Models the effect of the scale and add parameters.  I think the current
2106ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    // implementation misbehaves.
2116ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    private static class Scaler {
2126ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        private final float sMult;
2136ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        private final float sAdd;
2146ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2156ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Scaler(float sMult, float sAdd) {
2166ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            this.sMult = sMult - 1;
2176ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            this.sAdd = sAdd;
2186ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2196ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2206ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        public int scale(float height) {
2211065758a0f8966a8597a61492112f7859a7050a4Doug Felt            int altVal = (int)(height * sMult + sAdd + 0.5);
2226ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            int rndVal = Math.round(height * sMult + sAdd);
2236ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            if (altVal != rndVal) {
2246ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                Log.i("Scale", "expected scale: " + rndVal +
2256ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                        " != returned scale: " + altVal);
2266ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            }
2271065758a0f8966a8597a61492112f7859a7050a4Doug Felt            return rndVal;
2286ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2296ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
2306ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2319f7a4442b89cc06cb8cae6992484e7ae795323abDoug Felt    /* package */ static LayoutBuilder builder() {
2326ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        return new LayoutBuilder();
2336ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
2346ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2359f7a4442b89cc06cb8cae6992484e7ae795323abDoug Felt    /* package */ static class LayoutBuilder {
2366ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        String text = "This is a test";
2376ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        TextPaint paint = new TextPaint(); // default
2386ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        int width = 100;
2396ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        Alignment align = ALIGN_NORMAL;
2406ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        float spacingMult = 1;
2416ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        float spacingAdd = 0;
2426ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        boolean includePad = false;
2436ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2446ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder setText(String text) {
2456ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            this.text = text;
2466ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            return this;
2476ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2486ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2496ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder setPaint(TextPaint paint) {
2506ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            this.paint = paint;
2516ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            return this;
2526ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2536ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2546ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder setWidth(int width) {
2556ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            this.width = width;
2566ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            return this;
2576ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2586ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2596ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder setAlignment(Alignment align) {
2606ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            this.align = align;
2616ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            return this;
2626ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2636ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2646ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder setSpacingMult(float spacingMult) {
2656ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            this.spacingMult = spacingMult;
2666ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            return this;
2676ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2686ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2696ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder setSpacingAdd(float spacingAdd) {
2706ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            this.spacingAdd = spacingAdd;
2716ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            return this;
2726ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2736ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2746ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        LayoutBuilder setIncludePad(boolean includePad) {
2756ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            this.includePad = includePad;
2766ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            return this;
2776ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2786ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2796ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt       Layout build() {
2806ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            return  new StaticLayout(text, paint, width, align, spacingMult,
2816ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt                spacingAdd, includePad);
2826ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2836ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
2846ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2856ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    private void assertVertMetrics(Layout l, int topPad, int botPad, int... values) {
2866ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertTopBotPadding(l, topPad, botPad);
2876ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertLinesMetrics(l, values);
2886ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
2896ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2906ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    private void assertLinesMetrics(Layout l, int... values) {
2916ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        // sanity check
2926ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        if ((values.length & 0x1) != 0) {
2936ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            throw new IllegalArgumentException(String.valueOf(values.length));
2946ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
2956ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2966ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        int lines = values.length >> 1;
2976ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(lines, l.getLineCount());
2986ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
2996ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        int t = 0;
3006ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        for (int i = 0, n = 0; i < lines; ++i, n += 2) {
3016ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            int a = values[n];
3026ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            int d = values[n+1];
3036ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            int h = -a + d;
3046ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            assertLineMetrics(l, i, t, a, d, h);
3056ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            t += h;
3066ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        }
3076ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
3086ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(t, l.getHeight());
3096ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
3106ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
3116ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    private void assertLineMetrics(Layout l, int line,
3126ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt            int top, int ascent, int descent, int height) {
3136ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        String info = "line " + line;
3146ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(info, top, l.getLineTop(line));
3156ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(info, ascent, l.getLineAscent(line));
3166ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(info, descent, l.getLineDescent(line));
3176ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(info, height, l.getLineBottom(line) - top);
3186ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
3196ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt
3206ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    private void assertTopBotPadding(Layout l, int topPad, int botPad) {
3216ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(topPad, l.getTopPadding());
3226ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt        assertEquals(botPad, l.getBottomPadding());
3236ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt    }
3246ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt}
325