-- Copyright (c) 2003-2007 ETH Zurich, Switzerland -- 2016 The University of Sheffield, UK -- -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions are met: -- -- * Redistributions of source code must retain the above copyright notice, this -- list of conditions and the following disclaimer. -- -- * Redistributions in binary form must reproduce the above copyright notice, -- this list of conditions and the following disclaimer in the documentation -- and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- -- SPDX-License-Identifier: BSD-2-Clause -- package eBank -- -- Class Customer ----------------- context Customer inv customer_must_have_account: (self.accounts->size() > 0) inv gender_impl_title: (gender implies (self.title = 'Mr.')) and self.accounts->select(a:Account| a.oclIsTypeOf(eBank.CreditAccount)) ->collect(ca:Account| ca.getBalance()) ->sum() > -100000 -- -- Interface Account -------------------- context Account inv: owner.accounts->includes(self) context Account::makeDeposit(amount:Integer):Boolean pre: amount > 0 context Account::makeWithdrawal(amount:Integer):Boolean pre: amount > 0 -- -- Class Transaction -------------------- context Transaction inv: amount >= 0 context Transaction::makeTransfer():Boolean pre: source.getCurrency() = destination.getCurrency() and source <> destination and amount > 0 post: ((source@pre.getBalance() - amount) = (source.getBalance())) and ((destination@pre.getBalance() + amount) = destination.getBalance()) post: source.getBalance() + destination.getBalance() = source@pre.getBalance() + destination@pre.getBalance() -- -- Class BankAccount -------------------- context BankAccount inv: BankAccount.allInstances->forAll(a1,a2 | a1<>a2 implies a1.accountNumber <> a2.accountNumber) -- alternative: Account.allInstances->isUnique(accountNumber) context BankAccount::getBalance():Integer post: result=balance context BankAccount::getCurrency():String post: result=currency context BankAccount::makeDeposit(amount:Integer):Boolean post: balance = balance@pre + amount context BankAccount::makeWithdrawal(amount:Integer):Boolean post: balance = balance@pre - amount and currency = currency@pre -- -- Class CurrencyTradingAccount ------------------------------- context CurrencyTradingAccount inv: currency <> tradingCurrency context CurrencyTradingAccount::getTradingCurrency() post: result = tradingCurrency context CurrencyTradingAccount::buy(amount:Integer) pre: amount > 0 post: balance = balance@pre + price * amount context CurrencyTradingAccount::sell(amount:Integer) pre: amount > 0 post: balance = balance@pre - price * amount -- -- Class CreditAccount ---------------------- context CreditAccount inv: creditLimit <= 0 and balance >= creditLimit and self.book->size() < 21 context CreditAccount::makeDeposit(amount:Integer):Boolean pre: amount <= maxAmount post: if(creditLimit <= balance-amount) then balance = balance@pre - amount and result = true else balance = balance@pre and result = false endif -- -- Class CheckBook ------------------ context Checkbook inv: self.checks->size() > 19 and self.checks->size() < 51 -- -- Class Check -------------- context Check inv: self.checkbook->size() = 0 or self.checkbook->size() = 1 endpackage