Skip to content

Commit

Permalink
Add ordered Quality of Iterables ordered by a given Comparator, closes
Browse files Browse the repository at this point in the history
  • Loading branch information
dmfs authored Dec 30, 2023
1 parent 15c8981 commit be906bc
Show file tree
Hide file tree
Showing 2 changed files with 152 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* Copyright 2023 dmfs GmbH
*
*
* 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 org.saynotobugs.confidence.quality.iterable;

import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Assessment;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.assessment.AllPassed;
import org.saynotobugs.confidence.assessment.PassIf;
import org.saynotobugs.confidence.description.Spaced;
import org.saynotobugs.confidence.description.Text;
import org.saynotobugs.confidence.description.Value;
import org.saynotobugs.confidence.quality.composite.QualityComposition;

import java.util.Comparator;
import java.util.Iterator;

import static org.saynotobugs.confidence.description.LiteralDescription.NEW_LINE;

@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
public final class Ordered<T> extends QualityComposition<Iterable<T>>
{
/**
* A {@link Quality} that describes an {@link Iterable} that iterates elements in the
* order imposed by the given {@link Comparator}.
*/
public Ordered(Comparator<? super T> comparator)
{
this("", comparator);
}

/**
* A {@link Quality} that describes an {@link Iterable} that iterates elements in the
* order imposed by the given {@link Comparator}.
* <p>
* This constructor also takes a description of the {@link Comparator}.
*/
public Ordered(String description, Comparator<? super T> comparator)
{
super(actual -> new AllPassed(new Text("["), NEW_LINE, new Text("]"), () -> new Iterator<Assessment>()
{
private final Iterator<T> mDelegate = actual.iterator();
private T mCurrent = mDelegate.hasNext() ? mDelegate.next() : null;
private int mIndex = 0;

@Override
public boolean hasNext()
{
return mDelegate.hasNext();
}

@Override
public Assessment next()
{
T next = mDelegate.next();
Assessment result = new PassIf(comparator.compare(mCurrent, next) <= 0,
new Spaced(
new Text(mIndex + ":"),
new Value(mCurrent),
new Text(">"),
new Text(++mIndex + ":"),
new Value(next)));
mCurrent = next;
return result;
}
}),
new Text("ordered" + (description.isEmpty() ? "" : " " + description)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* Copyright 2023 dmfs GmbH
*
*
* 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 org.saynotobugs.confidence.quality.iterable;

import org.dmfs.jems2.comparator.By;
import org.dmfs.jems2.iterable.EmptyIterable;
import org.dmfs.jems2.iterable.Seq;
import org.junit.jupiter.api.Test;
import org.saynotobugs.confidence.quality.composite.AllOf;
import org.saynotobugs.confidence.test.quality.Fails;
import org.saynotobugs.confidence.test.quality.HasDescription;
import org.saynotobugs.confidence.test.quality.Passes;

import static org.saynotobugs.confidence.Assertion.assertThat;

class OrderedTest
{
@Test
void test()
{
assertThat(new Ordered<>(new By<>(String::length)),
new AllOf<>(
new Passes<>(new Seq<>("1", "2", "3"),
new Seq<>("1", "12", "123"),
new Seq<>("1", "12"),
new Seq<>("1"),
new EmptyIterable<>()),
new Fails<>(new Seq<>("123", "12", "1"), "[0: \"123\" > 1: \"12\"\n 1: \"12\" > 2: \"1\"]"),
new Fails<>(new Seq<>("1", "2", "12", "1"), "[...\n 2: \"12\" > 3: \"1\"]"),
new HasDescription("ordered")
)
);
}

@Test
void testWithDescription()
{
assertThat(new Ordered<>("by length", new By<>(String::length)),
new AllOf<>(
new Passes<>(new Seq<>("1", "2", "3"),
new Seq<>("1", "12", "123"),
new Seq<>("1", "12"),
new Seq<>("1"),
new EmptyIterable<>()),
new Fails<>(new Seq<>("123", "12", "1"), "[0: \"123\" > 1: \"12\"\n 1: \"12\" > 2: \"1\"]"),
new Fails<>(new Seq<>("1", "2", "12", "1"), "[...\n 2: \"12\" > 3: \"1\"]"),
new HasDescription("ordered by length")
)
);
}
}

0 comments on commit be906bc

Please sign in to comment.