import { describe, it } from '@ephox/bedrock-client';
import { Testable } from '@ephox/dispute';
import fc from 'fast-check';
import * as Fun from 'ephox/katamari/api/Fun';
import { Future } from 'ephox/katamari/api/Future';
import { FutureResult } from 'ephox/katamari/api/FutureResult';
import { Result } from 'ephox/katamari/api/Result';
import { tResult } from 'ephox/katamari/api/ResultInstances';
import { arbResult } from 'ephox/katamari/test/arb/ArbDataTypes';
import { eqAsync } from 'ephox/katamari/test/AsyncProps';
type Testable = Testable.Testable;
const { tNumber } = Testable;
describe('atomic.katamari.ap.async.FutureResultTest', () => {
it('nu', () => fc.assert(fc.asyncProperty(arbResult(fc.integer(), fc.integer()), (r) => new Promise((resolve, reject) => {
FutureResult.nu((completer) => {
completer(r);
}).get((ii) => {
eqAsync('eq', r, ii, reject, tResult());
resolve();
});
}))));
it('fromFuture', () => fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
FutureResult.fromFuture(Future.pure(i)).get((ii) => {
eqAsync('eq', Result.value(i), ii, reject, tResult());
resolve();
});
}))));
it('wrap get', () => fc.assert(fc.asyncProperty(arbResult(fc.integer(), fc.integer()), (r) => new Promise((resolve, reject) => {
FutureResult.wrap(Future.pure(r)).get((ii) => {
eqAsync('eq', r, ii, reject, tResult());
resolve();
});
}))));
it('fromResult get', () => fc.assert(fc.asyncProperty(arbResult(fc.integer(), fc.integer()), (r) => new Promise((resolve, reject) => {
FutureResult.fromResult(r).get((ii) => {
eqAsync('eq', r, ii, reject, tResult());
resolve();
});
}))));
it('pure get', () => fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
FutureResult.pure(i).get((ii) => {
eqAsync('eq', Result.value(i), ii, reject, tResult());
resolve();
});
}))));
it('value get', () => fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
FutureResult.value(i).get((ii) => {
eqAsync('eq', Result.value(i), ii, reject, tResult());
resolve();
});
}))));
it('error get', () => fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
FutureResult.error(i).get((ii) => {
eqAsync('eq', Result.error(i), ii, reject, tResult());
resolve();
});
}))));
it('value mapResult', () => {
const f = (x: number) => x + 3;
return fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
FutureResult.value(i).mapResult(f).get((ii) => {
eqAsync('eq', Result.value(f(i)), ii, reject, tResult());
resolve();
});
})));
});
it('error mapResult', () => fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
FutureResult.error(i).mapResult(Fun.die('should not be called')).get((ii) => {
eqAsync('eq', Result.error(i), ii, reject, tResult());
resolve();
});
}))));
it('value mapError', () => fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
FutureResult.value(i).mapError(Fun.die('should not be called')).get((ii) => {
eqAsync('eq', Result.value(i), ii, reject, tResult());
resolve();
});
}))));
it('err mapError', () => {
const f = (x: number) => x + 3;
return fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
FutureResult.error(i).mapError(f).get((ii) => {
eqAsync('eq', Result.error(f(i)), ii, reject, tResult());
resolve();
});
})));
});
it('value bindFuture value', () => fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
const f = (x: number) => x % 4;
FutureResult.value(i).bindFuture((x) => FutureResult.value(f(x))).get((actual) => {
eqAsync('bind result', Result.value(f(i)), actual, reject, tResult(tNumber));
resolve();
});
}))));
it('bindFuture: value bindFuture error', () => fc.assert(fc.asyncProperty(fc.integer(), fc.string(), (i, s) => new Promise((resolve, reject) => {
FutureResult.value(i).bindFuture(() => FutureResult.error(s)).get((actual) => {
eqAsync('bind result', Result.error(s), actual, reject, tResult(tNumber));
resolve();
});
}))));
it('error bindFuture', () => fc.assert(fc.asyncProperty(fc.integer(), (i) => new Promise((resolve, reject) => {
FutureResult.error(i).bindFuture(Fun.die('should not be called')).get((actual) => {
eqAsync('bind result', Result.error(i), actual, reject, tResult(tNumber));
resolve();
});
}))));
});