%
% Name: adbooktest.dem
% Author: Tim Brecht 
% Date:   Jan 24, 1996
%
% This program is a driver to test the 
% AddressBook class. It makes heavy use
% of assertions, requires no input and
% produces very little output. The goal
% is to write a program that will run
% to completion successfully if and only
% if the underlying implementation of
% the AddressBook class is correct.

import AddressBook 
  in  "adbookar.tu" 

var found   : boolean
var entered : boolean
var address : string

address := "unknown"

AddressBook.Initialize()

% save nothing
AddressBook.Save()

% load nothing
AddressBook.Load()

% ensure nothing is in the book
AddressBook.LookUp("pig", address, found)
assert(found = false)

% add one entry and look it up
AddressBook.Enter("pig", "pen", entered)
assert(entered = true)
AddressBook.LookUp("pig", address, found)
assert(found = true)
assert(address = "pen")

% delete the only entry and lookup will fail
AddressBook.Delete("pig")
AddressBook.LookUp("pig", address, found)
assert(found = false)
assert(address = "pen")

% add a slightly different version of that entry
AddressBook.Enter("pig", "pig-pen", entered)
assert(entered = true)
AddressBook.LookUp("pig", address, found)
assert(found = true)
assert(address = "pig-pen")

% change the entry and find the new version
AddressBook.Change("pig", "sty")
AddressBook.LookUp("pig", address, found)
assert(found = true)
assert(address = "sty")

% add multiple entries 
AddressBook.Enter("bear", "cave", entered)
assert(entered = true)
AddressBook.Enter("dear", "range", entered)
assert(entered = true)
AddressBook.Enter("car", "garage", entered)
assert(entered = true)
AddressBook.Enter("pillow", "bed", entered)
assert(entered = true)

% look them all up
AddressBook.LookUp("pillow", address, found)
assert(found = true)
assert(address = "bed")
AddressBook.LookUp("car", address, found)
assert(found = true)
assert(address = "garage")
AddressBook.LookUp("dear", address, found)
assert(found = true)
assert(address = "range")
AddressBook.LookUp("bear", address, found)
assert(found = true)
assert(address = "cave")
AddressBook.LookUp("pig", address, found)
assert(found = true)
assert(address = "sty")

% save the current state
AddressBook.Save()

% now delete everything
AddressBook.Delete("pig")
AddressBook.Delete("bear")
AddressBook.Delete("dear")
AddressBook.Delete("car")
AddressBook.Delete("pillow")

% ensure that they are not there
address := "unknown"
AddressBook.LookUp("pillow", address, found)
assert(found = false)
assert(address = "unknown")
AddressBook.LookUp("car", address, found)
assert(found = false)
assert(address = "unknown")
AddressBook.LookUp("dear", address, found)
assert(found = false)
assert(address = "unknown")
AddressBook.LookUp("bear", address, found)
assert(found = false)
assert(address = "unknown")
AddressBook.LookUp("pig", address, found)
assert(found = false)
assert(address = "unknown")

% now reload 
AddressBook.Load()

% and test that each can be found again
AddressBook.LookUp("pillow", address, found)
assert(found = true)
assert(address = "bed")
AddressBook.LookUp("car", address, found)
assert(found = true)
assert(address = "garage")
AddressBook.LookUp("dear", address, found)
assert(found = true)
assert(address = "range")
AddressBook.LookUp("bear", address, found)
assert(found = true)
assert(address = "cave")
AddressBook.LookUp("pig", address, found)
assert(found = true)
assert(address = "sty")

% now change everything
AddressBook.Change("pig", "barn")
AddressBook.Change("bear", "den")
AddressBook.Change("dear", "meadow")
AddressBook.Change("car", "street")
AddressBook.Change("pillow", "floor")

% and test that each can be found again
AddressBook.LookUp("pillow", address, found)
assert(found = true)
assert(address = "floor")
AddressBook.LookUp("car", address, found)
assert(found = true)
assert(address = "street")
AddressBook.LookUp("dear", address, found)
assert(found = true)
assert(address = "meadow")
AddressBook.LookUp("bear", address, found)
assert(found = true)
assert(address = "den")
AddressBook.LookUp("pig", address, found)
assert(found = true)
assert(address = "barn")

put "Test completed successfully"
AddressBook.Finalize()