blob: 9b3fb3e3ad9323b8766b36a0f6eef786e7516f14 [file] [log] [blame]
/*
* Copyright 2019 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 androidx.ui.text
import androidx.benchmark.junit4.BenchmarkRule
import androidx.benchmark.junit4.measureRepeated
import androidx.test.filters.LargeTest
import androidx.ui.unit.Density
import androidx.ui.geometry.Offset
import androidx.ui.unit.sp
import androidx.ui.integration.test.RandomTextGenerator
import androidx.ui.integration.test.TextBenchmarkTestRule
import androidx.ui.integration.test.TextType
import androidx.ui.integration.test.cartesian
import androidx.ui.text.font.Font
import androidx.ui.text.style.TextDirectionAlgorithm
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
/**
* The benchmark for methods of [Paragraph].
*/
@LargeTest
@RunWith(Parameterized::class)
class ParagraphMethodBenchmark(private val textType: TextType, private val textLength: Int) {
@get:Rule
val benchmarkRule = BenchmarkRule()
@get:Rule
val textBenchmarkRule = TextBenchmarkTestRule()
companion object {
@JvmStatic
@Parameterized.Parameters(name = "type={0} length={1}")
fun initParameters() = cartesian(
arrayOf(TextType.PlainText, TextType.StyledText),
arrayOf(512)
)
}
// dummy object required to construct Paragraph
private val resourceLoader = object : Font.ResourceLoader {
override fun load(font: Font): Any {
return false
}
}
private fun paragraphIntrinsics(
textGenerator: RandomTextGenerator,
textLength: Int
): ParagraphIntrinsics {
val text = textGenerator.nextParagraph(textLength)
val spanStyles = if (textType == TextType.StyledText) {
textGenerator.createStyles(text)
} else {
listOf()
}
return ParagraphIntrinsics(
text = text,
density = Density(density = 1f),
style = TextStyle(
fontSize = 12.sp,
textDirectionAlgorithm = TextDirectionAlgorithm.ContentOrLtr
),
resourceLoader = resourceLoader,
spanStyles = spanStyles
)
}
private fun paragraph(
textGenerator: RandomTextGenerator,
textLength: Int = this.textLength,
preferredLineCount: Int = 4
): Paragraph {
val paragraphIntrinsics = paragraphIntrinsics(textGenerator, textLength)
return Paragraph(
paragraphIntrinsics = paragraphIntrinsics,
constraints = ParagraphConstraints(
width = paragraphIntrinsics.maxIntrinsicWidth / preferredLineCount
)
)
}
@Test
fun getPathForRange() {
textBenchmarkRule.generator { generator ->
val paragraph = paragraph(generator)
benchmarkRule.measureRepeated {
paragraph.getPathForRange(0, textLength / 2)
}
}
}
@Test
fun getCursorRect() {
textBenchmarkRule.generator { generator ->
val paragraph = paragraph(generator)
benchmarkRule.measureRepeated {
paragraph.getCursorRect(textLength / 2)
}
}
}
@Test
fun getLineLeft() {
textBenchmarkRule.generator { generator ->
val paragraph = paragraph(generator)
val line = paragraph.lineCount / 2
benchmarkRule.measureRepeated {
paragraph.getLineLeft(line)
}
}
}
@Test
fun getLineRight() {
textBenchmarkRule.generator { generator ->
val paragraph = paragraph(generator)
val line = paragraph.lineCount / 2
benchmarkRule.measureRepeated {
paragraph.getLineRight(line)
}
}
}
@Test
fun getLineWidth() {
textBenchmarkRule.generator { generator ->
val paragraph = paragraph(generator)
val line = paragraph.lineCount / 2
benchmarkRule.measureRepeated {
paragraph.getLineWidth(line / 2)
}
}
}
@Test
fun getHorizontalPosition() {
textBenchmarkRule.generator { generator ->
val paragraph = paragraph(generator)
benchmarkRule.measureRepeated {
paragraph.getHorizontalPosition(textLength / 2, true)
}
}
}
@Test
fun getOffsetForPosition() {
textBenchmarkRule.generator { generator ->
val paragraph = paragraph(generator)
val centerPosition = Offset(paragraph.width / 2, paragraph.height / 2)
benchmarkRule.measureRepeated {
paragraph.getOffsetForPosition(centerPosition)
}
}
}
@Test
fun getBoundingBox() {
textBenchmarkRule.generator { generator ->
val paragraph = paragraph(generator)
benchmarkRule.measureRepeated {
paragraph.getBoundingBox(textLength / 2)
}
}
}
}