Skip to content

Commit

Permalink
Relocate static factory methods, closes #178 (#179)
Browse files Browse the repository at this point in the history
This commit relocates most static factory methods (with the exception of the incubator and rxjava artifacts) to a location than makes it easier to discover them.
  • Loading branch information
dmfs authored Apr 5, 2024
1 parent 8ecf4c4 commit 496c5ca
Show file tree
Hide file tree
Showing 183 changed files with 849 additions and 403 deletions.
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,23 @@ public static EmptyCharSequence emptyCharSequence() {
}
```

## Discoverability of Qualities

When it comes to writing tests, finding the right `Quality` can often feel like searching for a needle in a haystack. While some frameworks rely on fluent APIs to ease this process, Confidence takes a different approach.

Instead of a fluent API, Confidence organizes its static factory methods into classes named after the types they describe. This convention simplifies the process of discovering `Quality`s, as your IDE may suggest available options simply by typing out the type you're testing.

For example, if you're working with an instance of `Iterable` (e.g. an `ArrayList`), you'll find suitable `Quality`s in the `org.saynotobugs.confidence.core.quality.Iterable` class. While this may differ from the exact naming of the type you're testing, it ensures a logical organization that aids in discovery.

However, there are cases where a `Quality` doesn't directly correlate to a specific type or serves as an adapter. Currently, Confidence addresses four such scenarios:

* **Compositions**: `Quality`s like `allOf`, `not`, or `has` are grouped under the `Composite` class.
* **Grammar Improvements**: `Quality`s that enhance grammar, such as `is`, `to`, and `soIt`, reside in the `Grammar` class.
* **Framework Adapters**: Adapters to other frameworks, such as the Hamcrest adapter `qualifiesAs`, are found in the `Adapter` class.
* **Abstract Concepts**: `Quality` s representing abstract concepts, like JSON qualities, are housed in the `Json` class.

This organization ensures that regardless of the type or scenario you're testing, Confidence provides a structured and intuitive approach to discovering and utilizing its `Quality`s.

## Testing Qualities

Classic non-declarative tests often times have a major flaw: the (often times very imperative) test code is not tested itself. After all, you only can trust your production code, when you can trust the test code too.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.objectweb.asm.Type;
import org.saynotobugs.confidence.asm.AnnotationAdapter;

import java.lang.Class;
import java.lang.annotation.Annotation;
import java.lang.reflect.Proxy;
import java.util.HashMap;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import org.dmfs.jems2.Function;
import org.objectweb.asm.Type;

import java.lang.Class;

final class ClassFunction implements Function<Type, Class<?>>
{
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package org.saynotobugs.confidence.asm.quality;

import org.dmfs.jems2.iterable.Mapped;
import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.objectweb.asm.ClassReader;
import org.saynotobugs.confidence.Quality;
Expand All @@ -28,13 +29,16 @@
import org.saynotobugs.confidence.quality.composite.Has;
import org.saynotobugs.confidence.quality.composite.QualityComposition;

import java.lang.Class;
import java.util.ArrayList;
import java.util.Collection;

/**
* {@link Quality} of a class read from a class file.
*/
@StaticFactories(value = "Asm", packageName = "org.saynotobugs.confidence.asm")
@StaticFactories(value = "Class",
packageName = "org.saynotobugs.confidence.asm.quality",
deprecates = @DeprecatedFactories(value = "Asm", packageName = "org.saynotobugs.confidence.asm"))
public final class ClassThat extends QualityComposition<Class<?>>
{
public ClassThat(Quality<? super ClassAdapter> delegate)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,23 @@

package org.saynotobugs.confidence.asm.quality;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.asm.ClassAdapter;
import org.saynotobugs.confidence.quality.annotation.Annotation;
import org.saynotobugs.confidence.quality.composite.Has;
import org.saynotobugs.confidence.quality.composite.QualityComposition;

import java.lang.annotation.RetentionPolicy;

/**
* {@link Quality} of a {@link Class} that's annotated with a specific {@code class} or {@code runtime} scoped
* {@link Annotation}.
* {@link Quality} of a {@link java.lang.Class} that's annotated with a specific {@link RetentionPolicy#CLASS} or
* {@link RetentionPolicy#RUNTIME} scoped {@link Annotation}.
*/
@StaticFactories(value = "Asm", packageName = "org.saynotobugs.confidence.asm")
@StaticFactories(value = "Class",
packageName = "org.saynotobugs.confidence.asm.quality",
deprecates = @DeprecatedFactories(value = "Asm", packageName = "org.saynotobugs.confidence.asm"))
public final class HasDeclaredAnnotations extends QualityComposition<ClassAdapter>
{
public HasDeclaredAnnotations(Quality<? super Iterable<java.lang.annotation.Annotation>> delegate)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import org.dmfs.jems2.Function;

import java.lang.Class;
import java.lang.reflect.Method;

final class MethodFunction implements Function<String, Method>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import org.saynotobugs.confidence.quality.grammar.To;
import org.saynotobugs.confidence.quality.object.InstanceOf;

import java.lang.Class;

import static org.dmfs.jems2.confidence.Jems2.maps;
import static org.dmfs.jems2.confidence.Jems2.throwing;
import static org.saynotobugs.confidence.Assertion.assertThat;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.saynotobugs.confidence.test.quality.HasDescription;
import org.saynotobugs.confidence.test.quality.Passes;

import java.lang.Class;
import java.lang.annotation.Annotation;

import static org.saynotobugs.confidence.Assertion.assertThat;
Expand All @@ -39,7 +40,7 @@ class ClassThatTest
@Test
void test()
{
assertThat(new ClassThat(new Has<>("annotations",ClassAdapter::declaredAnnotations, new Iterates<>(new InstanceOf<>(Annotation.class)))),
assertThat(new ClassThat(new Has<>("annotations", ClassAdapter::declaredAnnotations, new Iterates<>(new InstanceOf<>(Annotation.class)))),
new AllOf<>(
new Passes<Class<?>>(AnnotatedTestClass.class),
new Fails<>(TestClassWithoutAnnotation.class, "Class that had annotations iterated [ 0: missing instance of <interface java.lang.annotation.Annotation> ]"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
import org.saynotobugs.confidence.test.quality.HasDescription;
import org.saynotobugs.confidence.test.quality.Passes;

import java.lang.Class;

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

class HasDeclaredAnnotationsTest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.annotation;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.quality.composite.AllOf;
Expand All @@ -27,7 +28,10 @@
/**
* Quality of an {@link java.lang.annotation.Annotation}.
*/
@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "Annotation",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class Annotation extends QualityComposition<java.lang.annotation.Annotation>
{
@SafeVarargs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.array;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.description.Text;
Expand All @@ -28,7 +29,10 @@
import org.saynotobugs.confidence.utils.ArrayIterable;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "Array",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class ArrayThat extends QualityComposition<Object>
{
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.autoclosable;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.description.Text;
Expand All @@ -30,7 +31,10 @@
/**
* A {@link Quality} of an {@link AutoCloseable} object. It delegates to another {@link Quality} and calls {@link AutoCloseable#close()} afterwards.
*/
@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "AutoClosable",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class AutoClosableThat<T extends AutoCloseable> extends QualityComposition<T>
{
public AutoClosableThat(Quality<? super T> delegate)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.charsequence;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.description.CharSequenceDescription;
import org.saynotobugs.confidence.description.Spaced;
Expand All @@ -29,7 +30,10 @@
import java.util.regex.Pattern;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "CharSequence",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class ContainsPattern extends QualityComposition<CharSequence>
{
public ContainsPattern(String pattern)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,17 @@

package org.saynotobugs.confidence.quality.charsequence;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.description.Text;
import org.saynotobugs.confidence.quality.composite.QualityComposition;
import org.saynotobugs.confidence.quality.object.Satisfies;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "CharSequence",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class EmptyCharSequence extends QualityComposition<CharSequence>
{
public EmptyCharSequence()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,18 @@

package org.saynotobugs.confidence.quality.charsequence;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.quality.composite.Has;
import org.saynotobugs.confidence.quality.composite.QualityComposition;
import org.saynotobugs.confidence.quality.object.EqualTo;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "CharSequence",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class HasLength extends QualityComposition<CharSequence>
{
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.charsequence;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.description.CharSequenceDescription;
import org.saynotobugs.confidence.description.Spaced;
Expand All @@ -29,7 +30,10 @@
import java.util.regex.Pattern;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "CharSequence",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class MatchesPattern extends QualityComposition<CharSequence>
{
public MatchesPattern(String pattern)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.collection;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.quality.composite.Has;
Expand All @@ -27,7 +28,10 @@
import java.util.Collection;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "Collection",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class HasSize extends QualityComposition<Collection<?>>
{
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.comparable;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.description.Spaced;
Expand All @@ -27,7 +28,10 @@
import org.saynotobugs.confidence.quality.object.Satisfies;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "Comparable",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class ComparesEqualTo<T extends Comparable<? super T>> extends QualityComposition<T>
{
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.comparable;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.description.Spaced;
Expand All @@ -27,7 +28,10 @@
import org.saynotobugs.confidence.quality.object.Satisfies;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "Comparable",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class GreaterThan<T extends Comparable<? super T>> extends QualityComposition<T>
{
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.comparable;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.description.Spaced;
Expand All @@ -27,7 +28,10 @@
import org.saynotobugs.confidence.quality.object.Satisfies;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "Comparable",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class GreaterThanOrEqualTo<T extends Comparable<? super T>> extends QualityComposition<T>
{
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.comparable;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.description.Spaced;
Expand All @@ -27,7 +28,10 @@
import org.saynotobugs.confidence.quality.object.Satisfies;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "Comparable",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class LessThan<T extends Comparable<? super T>> extends QualityComposition<T>
{

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.saynotobugs.confidence.quality.comparable;

import org.dmfs.srcless.annotations.staticfactory.DeprecatedFactories;
import org.dmfs.srcless.annotations.staticfactory.StaticFactories;
import org.saynotobugs.confidence.Quality;
import org.saynotobugs.confidence.description.Spaced;
Expand All @@ -27,7 +28,10 @@
import org.saynotobugs.confidence.quality.object.Satisfies;


@StaticFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality")
@StaticFactories(
value = "Comparable",
packageName = "org.saynotobugs.confidence.core.quality",
deprecates = @DeprecatedFactories(value = "Core", packageName = "org.saynotobugs.confidence.quality"))
public final class LessThanOrEqualTo<T extends Comparable<? super T>> extends QualityComposition<T>
{

Expand Down
Loading

0 comments on commit 496c5ca

Please sign in to comment.