All files / patterns/money/src money.ts

100% Statements 31/31
100% Branches 8/8
100% Functions 13/13
100% Lines 31/31

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  3x 3x     41x 41x 41x 41x 41x     31x     42x     3x 2x 2x     4x 3x 1x   2x 2x     2x 2x     3x 1x   2x 2x     1x     1x     2x     1x     2x     7x 2x       3x                                                                            
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);
        }
    }
}