blob: 7626f0f962fc7a54d702abe12b91a086edfb3248 [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 com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
@OptIn(InternalTextApi::class)
@RunWith(JUnit4::class)
class TextRangeTest {
@Test
fun substring() {
val text = "abcdef"
assertThat(text.substring(TextRange(0, 3))).isEqualTo(text.substring(0, 3))
}
@Test
fun substring_not_start_larger_than_end() {
val text = "abcdef"
assertThat(text.substring(TextRange(3, 0))).isEqualTo(text.substring(0, 3))
}
@Test
fun min_max() {
val textRange = TextRange(9, 8)
assertThat(textRange.min).isEqualTo(8)
assertThat(textRange.max).isEqualTo(9)
}
@Test
fun equality() {
assertThat(TextRange(0, 0)).isEqualTo(TextRange(0, 0))
assertThat(TextRange(0, 1)).isEqualTo(TextRange(0, 1))
assertThat(TextRange(0, 1)).isNotEqualTo(TextRange(0, 0))
}
@Test
fun test_range_collapsed() {
assertThat(TextRange(0, 0).collapsed).isTrue()
assertThat(TextRange(1, 1).collapsed).isTrue()
assertThat(TextRange(0, 1).collapsed).isFalse()
assertThat(TextRange(1, 2).collapsed).isFalse()
}
@Test
fun test_intersects() {
// same values intersect
assertThat(TextRange(0, 1).intersects(TextRange(0, 1))).isTrue()
// first one covers second one
assertThat(TextRange(0, 2).intersects(TextRange(1, 2))).isTrue()
// first one covers second one
assertThat(TextRange(0, 2).intersects(TextRange(0, 1))).isTrue()
// second one covers first one
assertThat(TextRange(0, 1).intersects(TextRange(0, 2))).isTrue()
// regular intersection
assertThat(TextRange(0, 3).intersects(TextRange(1, 4))).isTrue()
// opposite of regular intersection
assertThat(TextRange(1, 4).intersects(TextRange(0, 3))).isTrue()
assertThat(TextRange(0, 1).intersects(TextRange(1, 2))).isFalse()
assertThat(TextRange(0, 1).intersects(TextRange(2, 3))).isFalse()
assertThat(TextRange(1, 2).intersects(TextRange(0, 1))).isFalse()
assertThat(TextRange(2, 3).intersects(TextRange(0, 1))).isFalse()
}
@Test
fun test_contains_range() {
assertThat(TextRange(0, 2).contains(TextRange(0, 1))).isTrue()
assertThat(TextRange(0, 2).contains(TextRange(0, 2))).isTrue()
assertThat(TextRange(0, 2).contains(TextRange(0, 3))).isFalse()
assertThat(TextRange(0, 2).contains(TextRange(1, 3))).isFalse()
}
@Test
fun test_contains_range_operator() {
assertThat(TextRange(0, 1) in TextRange(0, 2)).isTrue()
assertThat(TextRange(0, 2) in TextRange(0, 2)).isTrue()
assertThat(TextRange(0, 3) in TextRange(0, 2)).isFalse()
assertThat(TextRange(1, 3) in TextRange(0, 2)).isFalse()
}
@Test
fun test_contains_offset() {
assertThat(TextRange(0, 2).contains(0)).isTrue()
assertThat(TextRange(0, 2).contains(1)).isTrue()
// end is exclusive therefore won't contain
assertThat(TextRange(0, 2).contains(2)).isFalse()
assertThat(TextRange(0, 2).contains(3)).isFalse()
}
@Test
fun test_contains_offset_operator() {
assertThat(0 in TextRange(0, 2)).isTrue()
assertThat(1 in TextRange(0, 2)).isTrue()
// end is exclusive therefore won't contain
assertThat(2 in TextRange(0, 2)).isFalse()
assertThat(3 in TextRange(0, 2)).isFalse()
}
@Test(expected = IllegalArgumentException::class)
fun test_does_not_accept_negative_value_for_start() {
TextRange(-1, 1)
}
@Test(expected = IllegalArgumentException::class)
fun test_does_not_accept_negative_value_for_end() {
TextRange(1, -1)
}
@Test
fun constrain_returns_same_object_if_no_change_required() {
val textRange = TextRange(1, 2)
assertThat(textRange.constrain(0, 3)).isSameInstanceAs(textRange)
}
@Test
fun constrain_updates_start_end_if_required() {
assertThat(TextRange(0, 4).constrain(1, 3)).isEqualTo(TextRange(1, 3))
}
@Test
fun constrain_collapsed_TextRange_with_the_same_min_max_returns_the_same_instance() {
val textRange = TextRange(2, 2)
assertThat(textRange.constrain(2, 2)).isSameInstanceAs(textRange)
}
@Test
fun constrain_with_collapsed_min_max_returns_collapsed_values() {
assertThat(TextRange(1, 2).constrain(2, 2)).isEqualTo(TextRange(2, 2))
assertThat(TextRange(2, 3).constrain(2, 2)).isEqualTo(TextRange(2, 2))
}
@Test
fun constrain_min_max_greater_than_TextRange_values() {
assertThat(TextRange(0, 4).constrain(5, 6)).isEqualTo(TextRange(5, 5))
}
@Test
fun constrain_min_smaller_than_TextRange_values() {
assertThat(TextRange(5, 6).constrain(0, 4)).isEqualTo(TextRange(4, 4))
}
}