001 // Copyright 2007 Waterken Inc. under the terms of the MIT X license 002 // found at http://www.opensource.org/licenses/mit-license.html 003 package org.ref_send.test; 004 005 import static org.ref_send.promise.Eventual.ref; 006 007 import java.io.Serializable; 008 009 import org.ref_send.promise.Deferred; 010 import org.ref_send.promise.Do; 011 import org.ref_send.promise.Eventual; 012 import org.ref_send.promise.Promise; 013 import org.ref_send.promise.Resolver; 014 015 /** 016 * Test condition operations. 017 */ 018 public final class 019 Logic { 020 private Logic() {} 021 022 /** 023 * Creates a when block that compares against an expected value. 024 * @param <T> referent type 025 * @param expected expected value 026 */ 027 static public <T> Do<T,Promise<?>> 028 was(final T expected) { 029 class Was extends Do<T,Promise<?>> implements Serializable { 030 static private final long serialVersionUID = 1L; 031 032 public Promise<?> 033 fulfill(final T value) throws Exception { 034 if (expected.equals(value)) { return ref(true); } 035 throw new Exception(); 036 } 037 } 038 return new Was(); 039 } 040 041 /** 042 * Fulfills a promise after each listed promise is fulfilled. 043 * @param _ eventual operator 044 * @param tests each promise to test 045 * @return promise that is fulfilled if each of the listed promises is 046 * fulfilled; otherwise, the promise is rejected 047 */ 048 static public Promise<?> 049 join(final Eventual _, final Object... tests) { 050 if (0 == tests.length) { return ref(true); } 051 final Deferred<Boolean> answer = _.defer(); 052 final int[] todo = { tests.length }; 053 final Resolver<Boolean> resolver = answer.resolver; 054 for (final Object test : tests) { 055 class Join extends Do<Object,Void> implements Serializable { 056 static private final long serialVersionUID = 1L; 057 058 public Void 059 fulfill(final Object value) { 060 if (0 == --todo[0]) { 061 resolver.apply(true); 062 } else { 063 resolver.progress(); 064 } 065 return null; 066 } 067 public Void 068 reject(final Exception e) { 069 resolver.reject(e); 070 return null; 071 } 072 } 073 _.when(test, new Join()); 074 } 075 return answer.promise; 076 } 077 }