import {CompilerError} from '../CompilerError';
import {Err, Ok, Result} from '../Utils/Result';
function addMax10(a: number, b: number): Result<number, string> {
const n = a + b;
return n > 10 ? Err(`${n} is too high`) : Ok(n);
}
function onlyFoo(foo: string): Result<string, string> {
return foo === 'foo' ? Ok(foo) : Err(foo);
}
class CustomDummyError extends Error {}
describe('Result', () => {
test('.map', () => {
expect(addMax10(1, 1).map(n => n * 2)).toEqual(Ok(4));
expect(addMax10(10, 10).map(n => n * 2)).toEqual(Err('20 is too high'));
});
test('.mapErr', () => {
expect(addMax10(1, 1).mapErr(e => `not a number: ${e}`)).toEqual(Ok(2));
expect(addMax10(10, 10).mapErr(e => `couldn't add: ${e}`)).toEqual(
Err("couldn't add: 20 is too high"),
);
});
test('.mapOr', () => {
expect(onlyFoo('foo').mapOr(42, v => v.length)).toEqual(3);
expect(onlyFoo('bar').mapOr(42, v => v.length)).toEqual(42);
});
test('.mapOrElse', () => {
expect(
onlyFoo('foo').mapOrElse(
() => 42,
v => v.length,
),
).toEqual(3);
expect(
onlyFoo('bar').mapOrElse(
() => 42,
v => v.length,
),
).toEqual(42);
});
test('.andThen', () => {
expect(addMax10(1, 1).andThen(n => Ok(n * 2))).toEqual(Ok(4));
expect(addMax10(10, 10).andThen(n => Ok(n * 2))).toEqual(
Err('20 is too high'),
);
});
test('.and', () => {
expect(addMax10(1, 1).and(Ok(4))).toEqual(Ok(4));
expect(addMax10(10, 10).and(Ok(4))).toEqual(Err('20 is too high'));
expect(addMax10(1, 1).and(Err('hehe'))).toEqual(Err('hehe'));
expect(addMax10(10, 10).and(Err('hehe'))).toEqual(Err('20 is too high'));
});
test('.or', () => {
expect(addMax10(1, 1).or(Ok(4))).toEqual(Ok(2));
expect(addMax10(10, 10).or(Ok(4))).toEqual(Ok(4));
expect(addMax10(1, 1).or(Err('hehe'))).toEqual(Ok(2));
expect(addMax10(10, 10).or(Err('hehe'))).toEqual(Err('hehe'));
});
test('.orElse', () => {
expect(addMax10(1, 1).orElse(str => Err(str.toUpperCase()))).toEqual(Ok(2));
expect(addMax10(10, 10).orElse(str => Err(str.toUpperCase()))).toEqual(
Err('20 IS TOO HIGH'),
);
});
test('.isOk', () => {
expect(addMax10(1, 1).isOk()).toBeTruthy();
expect(addMax10(10, 10).isOk()).toBeFalsy();
});
test('.isErr', () => {
expect(addMax10(1, 1).isErr()).toBeFalsy();
expect(addMax10(10, 10).isErr()).toBeTruthy();
});
test('.expect', () => {
expect(addMax10(1, 1).expect('a number under 10')).toEqual(2);
expect(() => {
addMax10(10, 10).expect('a number under 10');
}).toThrowErrorMatchingInlineSnapshot(
`"a number under 10: 20 is too high"`,
);
});
test('.expectErr', () => {
expect(() => {
addMax10(1, 1).expectErr('a number under 10');
}).toThrowErrorMatchingInlineSnapshot(`"a number under 10: 2"`);
expect(addMax10(10, 10).expectErr('a number under 10')).toEqual(
'20 is too high',
);
});
test('.unwrap', () => {
expect(addMax10(1, 1).unwrap()).toEqual(2);
expect(() => {
addMax10(10, 10).unwrap();
}).toThrowErrorMatchingInlineSnapshot(
`"Can't unwrap \`Err\` to \`Ok\`: 20 is too high"`,
);
expect(() => {
Err(new CustomDummyError('oops')).unwrap();
}).toThrowErrorMatchingInlineSnapshot(`"oops"`);
});
test('.unwrapOr', () => {
expect(addMax10(1, 1).unwrapOr(4)).toEqual(2);
expect(addMax10(10, 10).unwrapOr(4)).toEqual(4);
});
test('.unwrapOrElse', () => {
expect(addMax10(1, 1).unwrapOrElse(() => 4)).toEqual(2);
expect(addMax10(10, 10).unwrapOrElse(s => s.length)).toEqual(14);
});
test('.unwrapErr', () => {
expect(() => {
addMax10(1, 1).unwrapErr();
}).toThrowErrorMatchingInlineSnapshot(
`"Can't unwrap \`Ok\` to \`Err\`: 2"`,
);
expect(addMax10(10, 10).unwrapErr()).toEqual('20 is too high');
expect(() => {
Ok(new CustomDummyError('oops')).unwrapErr();
}).toThrowErrorMatchingInlineSnapshot(`"oops"`);
});
});