// Path: api/src/main/java/javax/observer/Observable.java
// public interface Observable<V> {
// 
//     /**
//      * Returns the current value.
//      * @return the value
//      */
//     V getValue();
// 
//     /**
//      * Returns an {@link Optional} that contains the current value or {@code null}. This is a
//      * convenience method that can be used to acces the value by using a fluent API based on
//      * the {@link Optional} API.
//      * @return an {@link Optional} that contains the current value or {@code null}
//      */
//     default Optional<V> value() {
//         return Optional.ofNullable(getValue());
//     }
// 
//     Subscription onChanged(ValueChangedListener<? super V> listener);
// 
//     default Subscription onChangedAndCall(final ValueChangedListener<? super V> listener) {
//         final Subscription subscription = onChanged(listener);
//         listener.valueChanged(new ValueChangedEvent<V>() {
//             @Override
//             public Observable<V> getObservable() {
//                 return Observable.this;
//             }
// 
//             @Override
//             public V getValue() {
//                 return Observable.this.getValue();
//             }
//         });
//         return subscription;
//     }
// 
//     Subscription onWillChange(ValueWillChangeListener<? super V> listener);
// }
// 
// Path: api/src/main/java/javax/observer/Subscription.java
// @FunctionalInterface
// public interface Subscription {
// 
//     void unsubscribe();
// }


import javax.observer.Observable;
import javax.observer.Subscription;
import java.util.Objects;
package javax.observer.tck;


/**
 * @author Achim Meißner
 */
public class CheckStringObservable {
    
    public static void checkStringObservableBasicMethods(final Observable<String> observable) {
        Objects.requireNonNull(observable);
        observable.getValue();
        observable.value();
        observable.value().orElse(null);

// Path: api/src/main/java/javax/observer/Observable.java
// public interface Observable<V> {
// 
//     /**
//      * Returns the current value.
//      * @return the value
//      */
//     V getValue();
// 
//     /**
//      * Returns an {@link Optional} that contains the current value or {@code null}. This is a
//      * convenience method that can be used to acces the value by using a fluent API based on
//      * the {@link Optional} API.
//      * @return an {@link Optional} that contains the current value or {@code null}
//      */
//     default Optional<V> value() {
//         return Optional.ofNullable(getValue());
//     }
// 
//     Subscription onChanged(ValueChangedListener<? super V> listener);
// 
//     default Subscription onChangedAndCall(final ValueChangedListener<? super V> listener) {
//         final Subscription subscription = onChanged(listener);
//         listener.valueChanged(new ValueChangedEvent<V>() {
//             @Override
//             public Observable<V> getObservable() {
//                 return Observable.this;
//             }
// 
//             @Override
//             public V getValue() {
//                 return Observable.this.getValue();
//             }
//         });
//         return subscription;
//     }
// 
//     Subscription onWillChange(ValueWillChangeListener<? super V> listener);
// }
// 
// Path: api/src/main/java/javax/observer/Subscription.java
// @FunctionalInterface
// public interface Subscription {
// 
//     void unsubscribe();
// }


// Path: tck/src/main/java/javax/observer/tck/CheckStringObservable.java
import javax.observer.Observable;
import javax.observer.Subscription;
import java.util.Objects;

package javax.observer.tck;


/**
 * @author Achim Meißner
 */
public class CheckStringObservable {
    
    public static void checkStringObservableBasicMethods(final Observable<String> observable) {
        Objects.requireNonNull(observable);
        observable.getValue();
        observable.value();
        observable.value().orElse(null);

        final Subscription willChangeSubscription = observable.onWillChange(e -> new RuntimeException("FAIL"));