javatests/de/jflex/ucd_generator/ucd/CodepointRangeSetTest.java (170 lines of code) (raw):

/* * Copyright (C) 2019-2020 Google, LLC. * SPDX-License-Identifier: BSD-3-Clause */ package de.jflex.ucd_generator.ucd; import static com.google.common.truth.Truth.assertThat; import de.jflex.testing.assertion.MoreAsserts; import de.jflex.ucd.CodepointRange; import org.junit.Test; /** Test for {@link CodepointRangeSet}. */ public class CodepointRangeSetTest { @Test public void add_disjoined() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create(42, 43)) .add(CodepointRange.create(100, 200)) .build(); assertThat(rangeSet.ranges()) .containsExactly(CodepointRange.create(42, 43), CodepointRange.create(100, 200)) .inOrder(); } @Test public void add_contiguous_inOrder() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create(42, 43)) .add(CodepointRange.create(44, 100)) .build(); assertThat(rangeSet.ranges()).containsExactly(CodepointRange.create(42, 100)).inOrder(); } @Test public void add_contiguous_inOrder2() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create('\000', '\u001f')) .add(CodepointRange.create('\u0020', '\u007e')) .add(CodepointRange.create('\u007f', '\u009f')) .build(); assertThat(rangeSet.ranges()) .containsExactly(CodepointRange.create('\000', '\u009f')) .inOrder(); } @Test public void add_contiguous_outOfOrder() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create(42, 43)) .add(CodepointRange.createPoint(1)) .add(CodepointRange.create(44, 100)) .add(CodepointRange.create(1000, 2000)) .build(); assertThat(rangeSet.ranges()) .containsExactly( CodepointRange.createPoint(1), CodepointRange.create(42, 100), CodepointRange.create(1000, 2000)) .inOrder(); } @Test public void add_contiguous_outOfOrder2() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create('\000', '\u001f')) .add(CodepointRange.create('\u007f', '\u009f')) .add(CodepointRange.create('\u0020', '\u007e')) .build(); assertThat(rangeSet.ranges()) .containsExactly(CodepointRange.create('\000', '\u009f')) .inOrder(); } @Test public void substract_disjoinedDoesNothing() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create(42, 43)) .add(CodepointRange.create(100, 200)) .substract(CodepointRange.create(10, 20)) .build(); assertThat(rangeSet.ranges()) .containsExactly(CodepointRange.create(42, 43), CodepointRange.create(100, 200)); } @Test public void substract_withinOne_splitIt() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create(42, 43)) .add(CodepointRange.create(50, 99)) .substract(CodepointRange.create(79, 80)) .build(); assertThat(rangeSet.ranges()) .containsExactly( CodepointRange.create(42, 43), CodepointRange.create(50, 78), CodepointRange.create(81, 99)); } @Test public void substract_overlapping() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create(1, 5)) .add(CodepointRange.create(10, 50)) .add(CodepointRange.create(60, 65)) .add(CodepointRange.create(70, 99)) .substract(CodepointRange.create(43, 78)) .build(); assertThat(rangeSet.ranges()) .containsExactly( CodepointRange.create(1, 5), CodepointRange.create(10, 42), CodepointRange.create(79, 99)); } @Test public void substract_self() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create(1, 42)) .add(CodepointRange.create(100, 101)) .substract(CodepointRange.create(1, 42)) .build(); assertThat(rangeSet.ranges()).containsExactly(CodepointRange.create(100, 101)); } @Test public void substract_endsEqual() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create('\t', '\r')) .add(CodepointRange.create('\u2028', '\u2029')) .substract(CodepointRange.create('\t' + 1, '\r')) .build(); assertThat(rangeSet.ranges()) .containsExactly( CodepointRange.createPoint('\t'), CodepointRange.create('\u2028', '\u2029')); } @Test public void substract_lastPoint() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create('\u1ff6', '\u1fff')) .add(CodepointRange.create('\u2029', '\u202A')) .substract(CodepointRange.createPoint('\u1fff')) .build(); assertThat(rangeSet.ranges()) .containsExactly( CodepointRange.create('\u1ff6', '\u1ffe'), CodepointRange.create('\u2029', '\u202A')); } @Test public void substract_startsEqual() { CodepointRangeSet rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create('\ud800', '\ufa2d')) .substract(CodepointRange.create('\ud800', '\udfff')) .build(); assertThat(rangeSet.ranges()).containsExactly(CodepointRange.create('\ue000', '\ufa2d')); } @Test public void substract_removeAll() { CodepointRangeSet.Builder rangeSet = CodepointRangeSet.builder() .add(CodepointRange.create(42, 43)) .add(CodepointRange.create(50, 99)) .substract(CodepointRange.create(40, 100)); MoreAsserts.assertThrows(IllegalStateException.class, rangeSet::build); } @Test public void intersection() { CodepointRangeSet.Builder rangeSetBuilder = CodepointRangeSet.builder() .add(CodepointRange.createPoint('\u0020')) .add(CodepointRange.createPoint('\u0085')) .add(CodepointRange.create('\u2000', '\u200a')); assertThat(rangeSetBuilder.intersection(CodepointRange.createPoint('\u0085'))) .containsExactly(MutableCodepointRange.createPoint('\u0085')); } }