All files / patterns/money/src money.ts

100% Statements 24/24
100% Branches 6/6
100% Functions 12/12
100% Lines 24/24

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                              2x       31x 31x     31x 31x       18x       9x       3x   2x   2x       4x   3x 1x     2x   2x       2x   2x       1x       1x       2x       1x       2x       7x 2x        
import { CurrencyInterface } from "./currency";
 
export interface MoneyInterface {
    getAmount(): number;
    getCurrency(): CurrencyInterface;
    add(money: MoneyInterface): void;
    substract(money: MoneyInterface): void;
    multiply(multiplier: number): void;
    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";
 
    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 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);
        }
    }
}