Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relocate static factory methods, closes #178 #179

Merged
merged 5 commits into from
Apr 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading