All files / patterns/src/money money.ts

100% Statements 29/29
100% Branches 5/5
100% Functions 13/13
100% Lines 29/29

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101                                14x       43x 43x   43x     43x 43x       38x       52x       3x   2x   2x       4x   3x 1x     2x   2x       2x   2x       3x 1x     2x   2x       1x       1x       2x       1x       2x       7x 2x        
import { CurrencyInterface } from "./currency";
 
export interface MoneyInterface {
    getAmount(): number;
    getCurrency(): CurrencyInterface;
    add(money: MoneyInterface): number;
    substract(money: MoneyInterface): number;
    multiply(multiplier: number): number;
    divide(divider: number): number;
    isEqualTo(money: MoneyInterface): boolean;
    greaterThan(money: MoneyInterface): boolean;
    greaterOrEqualThan(money: MoneyInterface): boolean;
    lowerThan(money: MoneyInterface): boolean;
    lowerOrEqualThan(money: MoneyInterface): boolean;
}
 
export class Money implements MoneyInterface {
    protected amount: number;
    protected currency: CurrencyInterface;
 
    private readonly sameCurrencyError: string = "Operation is only permitted on same currency";
    private readonly amountTooLowError: string = "Operation not possible, amount is not enough";
    private readonly dividerShouldBeGreatherThanZero: string =
        "Operation not possible, divider should be greater than 0";
 
    public constructor(amount: number, currency: CurrencyInterface) {
        this.amount = amount;
        this.currency = currency;
    }
 
    public getAmount(): number {
        return this.amount;
    }
 
    public getCurrency(): CurrencyInterface {
        return this.currency;
    }
 
    public add(money: MoneyInterface): number {
        this.checkCurrencies(this.currency, money.getCurrency());
 
        this.amount += money.getAmount();
 
        return this.amount;
    }
 
    public substract(money: MoneyInterface): number {
        this.checkCurrencies(this.currency, money.getCurrency());
 
        if (money.getAmount() > this.amount) {
            throw new Error(this.amountTooLowError);
        }
 
        this.amount -= money.getAmount();
 
        return this.amount;
    }
 
    public multiply(multiplier: number): number {
        this.amount *= multiplier;
 
        return this.amount;
    }
 
    public divide(divider: number): number {
        if (divider <= 0) {
            throw new Error(this.dividerShouldBeGreatherThanZero);
        }
 
        this.amount /= divider;
 
        return this.amount;
    }
 
    public isEqualTo(money: MoneyInterface): boolean {
        return this.amount === money.getAmount() && this.currency === money.getCurrency();
    }
 
    public greaterThan(money: MoneyInterface): boolean {
        return this.amount > money.getAmount();
    }
 
    public greaterOrEqualThan(money: MoneyInterface): boolean {
        return this.amount >= money.getAmount();
    }
 
    public lowerThan(money: MoneyInterface): boolean {
        return this.amount < money.getAmount();
    }
 
    public lowerOrEqualThan(money: MoneyInterface): boolean {
        return this.amount <= money.getAmount();
    }
 
    private checkCurrencies(currency1: CurrencyInterface, currency2: CurrencyInterface): void {
        if (currency1 !== currency2) {
            throw new TypeError(this.sameCurrencyError);
        }
    }
}