(* Rudimentary testing of the Ocaml libsndfile wrapper. *)

let write_test filename =
	let fmt = Sndfile.format Sndfile.MAJOR_WAV Sndfile.MINOR_PCM_16 in
	let file = Sndfile.openfile ~info:(Sndfile.WRITE, fmt, 2, 44100) filename in
	let writecount = Sndfile.write file [| 0.0 ;  0.0 ;  0.0 ;  0.0 ;  0.0 ;  0.0 ;  0.0 ;  0.5 |] in
	Printf.printf "Wrote %d items.\n" writecount ;
	Sndfile.close file

let read_test filename =
	let file = Sndfile.openfile filename in
	Printf.printf "File contains %Ld frames.\n" (Sndfile.frames file) ;
	let data = Array.create 100 0.0 in
	let readcount = Sndfile.read file data in
	Printf.printf "Read %d items.\n" readcount ;
	Sndfile.close file

let finalize_test filename =
	let sub_open_file = 
		let file = Sndfile.openfile filename in
		ignore file
	in
	(* Compact the heap. *)
	Gc.compact () ;
	let pre_stat = Gc.stat () in
	sub_open_file ;
	(* Compact the heap again. *)
	Gc.compact () ;
	(* Compare before and after. *)
	let post_stat = Gc.stat () in
	if pre_stat.Gc.heap_words != post_stat.Gc.heap_words then
	(	Printf.printf "\nFinalize not working : before %d -> after %d\n\n" pre_stat.Gc.heap_words post_stat.Gc.heap_words ;
		exit 1
		)
	else ()

let bad_read_test filename =
	try
		let file = Sndfile.openfile filename in
		ignore file ;
		print_endline "Ooops, this should have failed." ;
		exit 1
	with
		Sndfile.Error (e, s) ->
			if s = "System error." then () else
			(	Printf.printf "Bad error '%s'\n" s ;
				exit 1
				)


let _ =
	print_endline "------------------------" ;
	let filename = "a.wav" in
	write_test filename ;
	read_test filename ;
	finalize_test filename ;
	bad_read_test "this_file_does_not_exist.wav" ;
	print_endline "Done : All passed."