This repository has been archived on 2024-04-22. You can view files and clone it, but cannot push or open issues or pull requests.
ocl-examples/ebank/ebank.ocl

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