@hexadrop/either
Version:
Hexagonal architecture utils library
182 lines (142 loc) • 5.18 kB
text/typescript
import { describe, expect, test } from 'bun:test';
import Either from './either';
describe('Either', () => {
describe('flatMapLeft()', () => {
test('should works as expected', () => {
const either = Either.right<number, boolean>(true);
const map = either.flatMapLeft(v => Either.left(JSON.stringify(v)));
expect(map.isLeft()).toBeFalsy();
expect(map.isRight()).toBeTruthy();
expect(map.getRight()).toBe(true);
const either2 = Either.left<number, string>(1);
const map2 = either2.flatMapLeft(v => Either.right(JSON.stringify(v)));
expect(map2.isLeft()).toBeFalsy();
expect(map2.isRight()).toBeTruthy();
expect(map2.getRight()).toBe('1');
});
});
describe('flatMapRight()', () => {
test('should works as expected', () => {
const either = Either.right<number, boolean>(true);
const map = either.flatMapRight(v => Either.right(JSON.stringify(v)));
expect(map.isLeft()).toBeFalsy();
expect(map.isRight()).toBeTruthy();
expect(map.getRight()).toBe('true');
const either2 = Either.left<number, boolean>(1);
const map2 = either2.flatMapRight(v => Either.right(JSON.stringify(v)));
expect(map2.isLeft()).toBeTruthy();
expect(map2.isRight()).toBeFalsy();
expect(map2.getLeft()).toBe(1);
});
});
describe('fold()', () => {
test('should works as expected', () => {
const either = Either.right<Error, boolean>(true);
const fold = either.fold(
v => v.message,
() => 'true'
);
expect(fold).toBe('true');
const either2 = Either.left<Error, boolean>(new Error('MSG'));
const fold2 = either2.fold(
v => v.message,
() => 'true'
);
expect(fold2).toBe('MSG');
});
});
describe('getLeft()', () => {
test('should works as expected', () => {
const either = Either.left<number, boolean>(1);
expect(either.getLeft()).toBe(1);
const either2 = Either.right<number, boolean>(true);
expect(() => either2.getLeft()).toThrow('The value is right: {"kind":"right","rightValue":true}');
const either3 = Either.right<number, boolean>(true);
expect(() => either3.getLeft('MSG')).toThrow('MSG');
});
});
describe('getRight()', () => {
test('should works as expected', () => {
const either = Either.right<number, boolean>(true);
expect(either.getRight()).toBe(true);
const either2 = Either.left<number, boolean>(1);
expect(() => either2.getRight()).toThrow('The value is left: {"kind":"left","leftValue":1}');
const either3 = Either.left<number, boolean>(1);
expect(() => either3.getRight('MSG')).toThrow('MSG');
});
});
describe('isLeft()', () => {
test('should works as expected', () => {
const either = Either.left(true);
expect(either.isLeft()).toBe(true);
const either2 = Either.right(true);
expect(either2.isLeft()).toBe(false);
});
});
describe('isRight()', () => {
test('should works as expected', () => {
const either = Either.right(true);
expect(either.isRight()).toBe(true);
const either2 = Either.left(true);
expect(either2.isRight()).toBe(false);
});
});
describe('mapLeft()', () => {
test('should works as expected', () => {
const either = Either.right<number, boolean>(true);
const map = either.mapLeft(v => JSON.stringify(v));
expect(map.isLeft()).toBeFalsy();
expect(map.isRight()).toBeTruthy();
expect(map.getRight()).toBe(true);
const either2 = Either.left<number, boolean>(1);
const map2 = either2.mapLeft(v => JSON.stringify(v));
expect(map2.isLeft()).toBeTruthy();
expect(map2.isRight()).toBeFalsy();
expect(map2.getLeft()).toBe('1');
});
});
describe('mapRight()', () => {
test('should works as expected', () => {
const either = Either.right<number, boolean>(true);
const map = either.mapRight(v => JSON.stringify(v));
expect(map.isLeft()).toBeFalsy();
expect(map.isRight()).toBeTruthy();
expect(map.getRight()).toBe('true');
const either2 = Either.left<number, boolean>(1);
const map2 = either2.mapRight(v => JSON.stringify(v));
expect(map2.isLeft()).toBeTruthy();
expect(map2.isRight()).toBeFalsy();
expect(map2.getLeft()).toBe(1);
});
});
describe('getLeftOrElse()', () => {
test('should works as expected', () => {
const either = Either.left<number, boolean>(1);
expect(either.getLeftOrElse(2)).toBe(1);
const either2 = Either.right<number, boolean>(true);
expect(either2.getLeftOrElse(1)).toBe(1);
});
});
describe('getRightOrElse()', () => {
test('should works as expected', () => {
const either = Either.left<number, boolean>(1);
expect(either.getRightOrElse(true)).toBe(true);
const either2 = Either.right<number, boolean>(true);
expect(either2.getRightOrElse(false)).toBe(true);
});
});
describe('should 0 works as expected', () => {
test('with left', () => {
const expected = Either.left(0);
expect(expected.isLeft()).toBeTruthy();
expect(expected.isRight()).toBeFalsy();
expect(expected.getLeft()).toBe(0);
});
test('with right', () => {
const expected = Either.right(0);
expect(expected.isLeft()).toBeFalsy();
expect(expected.isRight()).toBeTruthy();
expect(expected.getRight()).toBe(0);
});
});
});