Skip to content

Commit 8ee6f28

Browse files
authored
Add RecurrenceSet::isFinite method to deprecate isInfinite, closes #134 (#135)
1 parent 05920e7 commit 8ee6f28

File tree

22 files changed

+184
-41
lines changed

22 files changed

+184
-41
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ dependencies {
7878
api libs.jems2
7979
testImplementation project("lib-recur-hamcrest")
8080
testImplementation project("lib-recur-confidence")
81-
testImplementation 'org.dmfs:jems2-testing:2.22.0'
81+
testImplementation libs.jems2.testing
8282
testImplementation libs.jems2.confidence
8383
testImplementation 'org.saynotobugs:confidence-core:0.42.0'
8484
}

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[versions]
22
eclipse-jdt = "2.2.600"
33
hamcrest = "2.2"
4-
jems2 = "2.22.0"
4+
jems2 = "2.23.1"
55
junit = "5.8.2"
66
junit-testkit = "1.9.2"
77
srcless = "0.3.0"

lib-recur-confidence/src/main/java/org/dmfs/rfc5545/confidence/quality/EmptyRecurrenceSet.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public EmptyRecurrenceSet()
3232
{
3333
super(new AllOf<>(
3434
new Is<>(new EmptyIterable()),
35+
new Is<>(new Finite()),
3536
new Is<>(new Not<>(new Infinite()))));
3637
}
3738
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2024 Marten Gajda <[email protected]>
3+
*
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.dmfs.rfc5545.confidence.quality;
19+
20+
import org.dmfs.rfc5545.RecurrenceSet;
21+
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
22+
import org.saynotobugs.confidence.description.Text;
23+
import org.saynotobugs.confidence.quality.composite.AllOf;
24+
import org.saynotobugs.confidence.quality.composite.Not;
25+
import org.saynotobugs.confidence.quality.composite.QualityComposition;
26+
import org.saynotobugs.confidence.quality.object.Satisfies;
27+
28+
@StaticFactories(value = "Recur", packageName = "org.dmfs.rfc5545.confidence")
29+
public final class Finite extends QualityComposition<RecurrenceSet>
30+
{
31+
public Finite()
32+
{
33+
super(new AllOf<>(
34+
new Not<>(new Satisfies<>(RecurrenceSet::isInfinite, new Text("infinite"))),
35+
new Satisfies<>(RecurrenceSet::isFinite, new Text("finite"))));
36+
}
37+
}

lib-recur-confidence/src/main/java/org/dmfs/rfc5545/confidence/quality/Infinite.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.dmfs.rfc5545.RecurrenceSet;
2121
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
2222
import org.saynotobugs.confidence.description.Text;
23+
import org.saynotobugs.confidence.quality.composite.AllOf;
24+
import org.saynotobugs.confidence.quality.composite.Not;
2325
import org.saynotobugs.confidence.quality.composite.QualityComposition;
2426
import org.saynotobugs.confidence.quality.object.Satisfies;
2527

@@ -28,6 +30,8 @@ public final class Infinite extends QualityComposition<RecurrenceSet>
2830
{
2931
public Infinite()
3032
{
31-
super(new Satisfies<>(RecurrenceSet::isInfinite, new Text("infinite")));
33+
super(new AllOf<>(
34+
new Not<>(new Satisfies<>(RecurrenceSet::isFinite, new Text("finite"))),
35+
new Satisfies<>(RecurrenceSet::isInfinite, new Text("infinite"))));
3236
}
3337
}

lib-recur-confidence/src/test/java/org/dmfs/rfc5545/confidence/quality/EmptyRecurrenceSetTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,25 @@ void test()
3838
allOf(
3939
org.saynotobugs.confidence.test.quality.Test.<RecurrenceSet>passes(mock(RecurrenceSet.class,
4040
with(RecurrenceSet::isInfinite, returning(false)),
41+
with(RecurrenceSet::isFinite, returning(true)),
4142
with(RecurrenceSet::iterator, returning(new EmptyIterator())))),
4243

4344
fails(mock(RecurrenceSet.class,
4445
with(RecurrenceSet::isInfinite, returning(true)),
46+
with(RecurrenceSet::isFinite, returning(false)),
4547
with(RecurrenceSet::iterator, returning(new EmptyIterator())))),
4648

4749
fails(mock(RecurrenceSet.class,
4850
with(RecurrenceSet::isInfinite, returning(false)),
51+
with(RecurrenceSet::isFinite, returning(true)),
4952
with(RecurrenceSet::iterator, returning(
5053
new FastForwardable(
5154
DateTime.parse("20240101"),
5255
new Seq<>(DateTime.parse("20240102"), DateTime.parse("20240103"))))))),
5356

5457
fails(mock(RecurrenceSet.class,
5558
with(RecurrenceSet::isInfinite, returning(true)),
59+
with(RecurrenceSet::isFinite, returning(false)),
5660
with(RecurrenceSet::iterator, returning(
5761
new FastForwardable(
5862
DateTime.parse("20240101"),
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright 2024 Marten Gajda <[email protected]>
3+
*
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.dmfs.rfc5545.confidence.quality;
19+
20+
import org.dmfs.rfc5545.InstanceIterator;
21+
import org.dmfs.rfc5545.RecurrenceSet;
22+
import org.junit.jupiter.api.Test;
23+
24+
import static org.dmfs.jems2.mockito.Mock.*;
25+
import static org.saynotobugs.confidence.Assertion.assertThat;
26+
import static org.saynotobugs.confidence.quality.Core.allOf;
27+
import static org.saynotobugs.confidence.test.quality.Test.fails;
28+
29+
class FiniteTest
30+
{
31+
@Test
32+
void test()
33+
{
34+
assertThat(new Finite(),
35+
allOf(
36+
org.saynotobugs.confidence.test.quality.Test.<RecurrenceSet>passes(mock(RecurrenceSet.class,
37+
with(RecurrenceSet::isInfinite, returning(false)),
38+
with(RecurrenceSet::isFinite, returning(true)),
39+
with(RecurrenceSet::iterator, returning(mock(InstanceIterator.class))))),
40+
41+
fails(mock(RecurrenceSet.class,
42+
with(RecurrenceSet::isInfinite, returning(true)),
43+
with(RecurrenceSet::isFinite, returning(false)),
44+
with(RecurrenceSet::iterator, returning(mock(InstanceIterator.class)))))));
45+
}
46+
47+
}

lib-recur-confidence/src/test/java/org/dmfs/rfc5545/confidence/quality/InfiniteTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,12 @@ void test()
3535
allOf(
3636
org.saynotobugs.confidence.test.quality.Test.<RecurrenceSet>passes(mock(RecurrenceSet.class,
3737
with(RecurrenceSet::isInfinite, returning(true)),
38+
with(RecurrenceSet::isFinite, returning(false)),
3839
with(RecurrenceSet::iterator, returning(mock(InstanceIterator.class))))),
3940

4041
fails(mock(RecurrenceSet.class,
4142
with(RecurrenceSet::isInfinite, returning(false)),
43+
with(RecurrenceSet::isFinite, returning(true)),
4244
with(RecurrenceSet::iterator, returning(mock(InstanceIterator.class)))))));
4345
}
4446

src/main/java/org/dmfs/rfc5545/RecurrenceSet.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
package org.dmfs.rfc5545;
1919

2020

21-
import org.dmfs.jems2.Optional;
22-
2321
/**
2422
* A set of instances.
2523
*/
@@ -32,6 +30,17 @@ public interface RecurrenceSet extends Iterable<DateTime>
3230

3331
/**
3432
* Returns whether this {@link RecurrenceSet} is infinite or not.
33+
*
34+
* @deprecated in favour of {@link #isFinite()}
3535
*/
36+
@Deprecated(forRemoval = true)
3637
boolean isInfinite();
38+
39+
/**
40+
* Returns whether this {@link RecurrenceSet} is finite.
41+
*/
42+
default boolean isFinite()
43+
{
44+
return !isInfinite();
45+
}
3746
}

src/main/java/org/dmfs/rfc5545/optional/LastInstance.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import org.dmfs.jems2.Optional;
2121
import org.dmfs.jems2.optional.DelegatingOptional;
22-
import org.dmfs.jems2.optional.Restrained;
22+
import org.dmfs.jems2.optional.If;
2323
import org.dmfs.rfc5545.DateTime;
2424
import org.dmfs.rfc5545.RecurrenceSet;
2525

@@ -31,6 +31,6 @@ public final class LastInstance extends DelegatingOptional<DateTime>
3131
{
3232
public LastInstance(RecurrenceSet recurrenceSet)
3333
{
34-
super(new Restrained<>(() -> !recurrenceSet.isInfinite(), new Last<>(recurrenceSet)));
34+
super(new If<>(recurrenceSet::isFinite, new Last<>(recurrenceSet)));
3535
}
3636
}

src/main/java/org/dmfs/rfc5545/recurrenceset/Difference.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,10 @@ public boolean isInfinite()
4747
{
4848
return mMinuend.isInfinite();
4949
}
50+
51+
@Override
52+
public boolean isFinite()
53+
{
54+
return mMinuend.isFinite();
55+
}
5056
}

src/main/java/org/dmfs/rfc5545/recurrenceset/FastForwarded.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,10 @@ public boolean isInfinite()
6565
{
6666
return mDelegate.isInfinite();
6767
}
68+
69+
@Override
70+
public boolean isFinite()
71+
{
72+
return mDelegate.isFinite();
73+
}
6874
}

src/main/java/org/dmfs/rfc5545/recurrenceset/Merged.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.dmfs.jems2.iterable.Mapped;
2121
import org.dmfs.jems2.iterable.Seq;
2222
import org.dmfs.jems2.iterable.Sieved;
23+
import org.dmfs.jems2.predicate.Not;
2324
import org.dmfs.rfc5545.InstanceIterator;
2425
import org.dmfs.rfc5545.RecurrenceSet;
2526

@@ -56,6 +57,11 @@ public boolean isInfinite()
5657
return new Sieved<>(RecurrenceSet::isInfinite, delegates).iterator().hasNext();
5758
}
5859

60+
@Override
61+
public boolean isFinite()
62+
{
63+
return !new Sieved<>(new Not<>(RecurrenceSet::isFinite), delegates).iterator().hasNext();
64+
}
5965
});
6066
}
6167

@@ -77,4 +83,10 @@ public boolean isInfinite()
7783
{
7884
return mDelegate.isInfinite();
7985
}
86+
87+
@Override
88+
public boolean isFinite()
89+
{
90+
return mDelegate.isFinite();
91+
}
8092
}

src/main/java/org/dmfs/rfc5545/recurrenceset/OfList.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,10 @@ public boolean isInfinite()
9393
{
9494
return false;
9595
}
96+
97+
@Override
98+
public boolean isFinite()
99+
{
100+
return true;
101+
}
96102
}

src/main/java/org/dmfs/rfc5545/recurrenceset/OfRule.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,10 @@ public boolean isInfinite()
4747
{
4848
return mRecurrenceRule.isInfinite();
4949
}
50+
51+
@Override
52+
public boolean isFinite()
53+
{
54+
return !mRecurrenceRule.isInfinite();
55+
}
5056
}

src/main/java/org/dmfs/rfc5545/recurrenceset/OfRuleAndFirst.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,10 @@ public boolean isInfinite()
6767
{
6868
return mRecurrenceRule.isInfinite();
6969
}
70+
71+
@Override
72+
public boolean isFinite()
73+
{
74+
return !mRecurrenceRule.isInfinite();
75+
}
7076
}

src/test/java/org/dmfs/rfc5545/recurrenceset/DifferenceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void testInstancesAndExceptions() throws InvalidRecurrenceRuleException
6565
new OfRule(new RecurrenceRule("FREQ=HOURLY;INTERVAL=12;COUNT=10"), DateTime.parse("20240224T120000")),
6666
new OfRule(new RecurrenceRule("FREQ=DAILY;COUNT=5"), DateTime.parse("20240224T000000"))),
6767
allOf(
68-
is(not(infinite())),
68+
is(finite()),
6969
iterates(
7070
DateTime.parse("20240224T120000"),
7171
DateTime.parse("20240225T120000"),
@@ -87,7 +87,7 @@ void test_github_issue_93() throws InvalidRecurrenceRuleException
8787
new OfRule(new RecurrenceRule("FREQ=WEEKLY;UNTIL=20200511T000000Z;BYDAY=TU"), DateTime.parse("20200414T160000Z")),
8888
new OfList(DateTime.parse("20200421T160000Z"), DateTime.parse("20200505T160000Z"))),
8989
allOf(
90-
is(not(infinite())),
90+
is(finite()),
9191
iterates(
9292
DateTime.parse("20200414T160000Z"),
9393
DateTime.parse("20200428T160000Z"))));

src/test/java/org/dmfs/rfc5545/recurrenceset/FastForwardedTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ void testFastForwardRule() throws InvalidRecurrenceRuleException
5555
new FastForwarded(DateTime.parse("20240218"),
5656
new OfRule(new RecurrenceRule("FREQ=DAILY;COUNT=5"), DateTime.parse("20240215"))),
5757
allOf(
58-
is(not(infinite())),
58+
is(finite()),
5959
iterates(
6060
DateTime.parse("20240218"),
6161
DateTime.parse("20240219"))));
@@ -69,7 +69,7 @@ void testFastForwardRuleWithUnsyncedStart() throws InvalidRecurrenceRuleExceptio
6969
new FastForwarded(DateTime.parse("20240218"),
7070
new OfRuleAndFirst(new RecurrenceRule("FREQ=DAILY;BYDAY=FR;COUNT=3"), DateTime.parse("20240215"))),
7171
allOf(
72-
is(not(infinite())),
72+
is(finite()),
7373
iterates(
7474
DateTime.parse("20240223"))));
7575
}
@@ -82,7 +82,7 @@ void testFastForwardRuleWithUnsyncedStartMultipleInstances() throws InvalidRecur
8282
new FastForwarded(DateTime.parse("20240218"),
8383
new OfRuleAndFirst(new RecurrenceRule("FREQ=DAILY;BYDAY=FR;COUNT=5"), DateTime.parse("20240207"))),
8484
allOf(
85-
is(not(infinite())),
85+
is(finite()),
8686
iterates(
8787
DateTime.parse("20240223"),
8888
DateTime.parse("20240301"))));
@@ -99,7 +99,7 @@ void testFastForwardList()
9999
DateTime.parse("20240218"),
100100
DateTime.parse("20240219"))),
101101
allOf(
102-
is(not(infinite())),
102+
is(finite()),
103103
iterates(
104104
DateTime.parse("20240218"),
105105
DateTime.parse("20240219"))));
@@ -118,7 +118,7 @@ void testFastForwardMultiple() throws InvalidRecurrenceRuleException
118118
DateTime.parse("20240220"),
119119
DateTime.parse("20240221"))),
120120
allOf(
121-
is(not(infinite())),
121+
is(finite()),
122122
iterates(
123123
DateTime.parse("20240218"),
124124
DateTime.parse("20240219"),
@@ -138,7 +138,7 @@ void testFastForwardWithExceptions() throws InvalidRecurrenceRuleException
138138
DateTime.parse("20240217"),
139139
DateTime.parse("20240220")))),
140140
allOf(
141-
is(not(infinite())),
141+
is(finite()),
142142
iterates(
143143
DateTime.parse("20240218"),
144144
DateTime.parse("20240219"),

0 commit comments

Comments
 (0)