108 lines
3.1 KiB
OCaml
Executable file
108 lines
3.1 KiB
OCaml
Executable file
open Mem
|
|
open Treemem
|
|
open Listmem
|
|
open Assocmem
|
|
open Util
|
|
|
|
(* Foncteur pour factoriser les tests.
|
|
* Les tests sont sommaires et ne se basent que sur la spécification,
|
|
* pas sur l'implémentation.
|
|
*)
|
|
module MemoryTest (M : Memory) =
|
|
struct
|
|
open M
|
|
|
|
(* writeall : mem -> (int * char) list -> mem
|
|
* Écrit un ensemble de valeurs dans une mémoire, aux addresses données.
|
|
*
|
|
* Paramètres :
|
|
* mem : M.mem, mémoire à impacter
|
|
* l : (int * char) list, liste de couples (adresse, valeur) à écrire
|
|
* Retour :
|
|
* mémoire mise à jour
|
|
*
|
|
* Exceptions : OutOfBound si une des adresses est en dehors de la zone
|
|
* autorisée.
|
|
*)
|
|
let rec writeall mem l =
|
|
match l with
|
|
| [] -> mem
|
|
| (addr,v)::q -> writeall (write mem addr v) q
|
|
|
|
(* Une mémoire de taille raisonnable avec des choses dedans *)
|
|
let mem1 =
|
|
writeall (clear 10) [
|
|
( 0, 'a');
|
|
( 12, 'b');
|
|
( 131, 'r');
|
|
(1001, 'a');
|
|
( 981, 'c');
|
|
( 15, 'a');
|
|
( 19, 'd');
|
|
( 451, 'a');
|
|
( 222, 'b');
|
|
( 223, 'r');
|
|
( 682, 'a')
|
|
]
|
|
|
|
(* Tester le stockage correct de la taille du bus d'adressage. *)
|
|
let%test "bussize-1" =
|
|
bussize (clear 5) = 5
|
|
let%test "bussize-2" =
|
|
bussize mem1 = 10
|
|
|
|
(* Tester le calcul correct de la taille de la mémoire. *)
|
|
let%test "size-1" =
|
|
size (clear 5) = 32
|
|
let%test "size-2" =
|
|
size mem1 = 1024
|
|
|
|
(* Tester la cohérence du retour de allocsize.
|
|
* Note : on ne peut pas tester la valeur exacte car cela dépend complètement
|
|
* de l'implémentation !
|
|
*)
|
|
let%test "allocsize-consistency-1" =
|
|
allocsize (clear 5) <= 32 &&
|
|
allocsize (clear 5) >= 0
|
|
|
|
(* Tester le retour de busyness. *)
|
|
let%test "busyness-0" =
|
|
busyness (clear 2) = 0
|
|
let%test "busyness-1" =
|
|
busyness mem1 = 11
|
|
|
|
(* Tester la validité de read *)
|
|
let%test "read-0" =
|
|
read mem1 0 = 'a'
|
|
let%test "read-1" =
|
|
read mem1 451 = 'a'
|
|
let%test "read-2" =
|
|
read mem1 221 = _0
|
|
|
|
(* Tester la validité de read et write.
|
|
* On est obligé de procéder ainsi (read ET write) car formellement, write
|
|
* n'a pas de résultat que l'on peu examiner, puisque les types sont
|
|
* abstraits (= effets de bord).
|
|
*)
|
|
let%test "read-write-0" =
|
|
let m' = write mem1 0 'z' in
|
|
read m' 0 = 'z'
|
|
let%test "read-write-1" =
|
|
let m' = write mem1 31 'a' in
|
|
read m' 31 = 'a'
|
|
let%test "read-write-2" =
|
|
let m' = write mem1 27 'a' in
|
|
let m''= write m' 27 'b' in
|
|
read m'' 27 = 'b'
|
|
|
|
(* Tester la bonne levée d'exception. *)
|
|
let%test "read-except" =
|
|
try let _ = read mem1 10000 in false with OutOfBound -> true
|
|
let%test "write-except" =
|
|
try let _ = write mem1 10000 '0' in false with OutOfBound -> true
|
|
end
|
|
|
|
module ListMemoryTest = MemoryTest (ListMemory)
|
|
module AssocMemoryTest = MemoryTest (AssocMemory)
|
|
module TreeMemoryTest = MemoryTest (TreeMemory)
|