143 lines
4.4 KiB
Plaintext
143 lines
4.4 KiB
Plaintext
-- 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
|