TP-programmation-fonctionnelle/BE/test.ml

108 lines
3.1 KiB
OCaml
Raw Normal View History

2023-06-21 18:13:54 +00:00
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)