Reviewed By: ngorogiannis Differential Revision: D16016776 fbshipit-source-id: c96c661b1master
parent
ae3089c2b2
commit
09efe4f2c1
@ -0,0 +1,60 @@
|
||||
(*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*)
|
||||
|
||||
open! IStd
|
||||
open OUnit2
|
||||
|
||||
let inputs =
|
||||
let a = `A 'a' in
|
||||
let b = Array.create ~len:10_000 a in
|
||||
let c = Array.create ~len:100 b in
|
||||
[ ("unit", Obj.repr ())
|
||||
; ("same representation", Obj.repr ([42], [|42; 0|]))
|
||||
; ("10K times the same element", Obj.repr b)
|
||||
; ("100 times 10K times the same element", Obj.repr c) ]
|
||||
|
||||
|
||||
let tests =
|
||||
let normalize input =
|
||||
let sharer = MaximumSharing.Sharer.create () in
|
||||
MaximumSharing.Sharer.normalize_value sharer input
|
||||
in
|
||||
let test_one input _ =
|
||||
(* Save this now, in case `MaximumSharing` mutates the [input], even though it shouldn't *)
|
||||
let serialized_input_with_sharing = Marshal.to_string input [] in
|
||||
let serialized_input_no_sharing = Marshal.to_string input [Marshal.No_sharing] in
|
||||
let reachable_words_input = Obj.reachable_words input in
|
||||
let normalized = normalize input in
|
||||
(*
|
||||
We can't really check [input] hasn't been mutated but its marshalling with sharing
|
||||
shouldn't have changed
|
||||
*)
|
||||
let serialized_input_with_sharing' = Marshal.to_string input [] in
|
||||
assert_equal serialized_input_with_sharing serialized_input_with_sharing' ;
|
||||
(*
|
||||
The whole goal of [MaximumSharing] is to reduce the memory footprint.
|
||||
Let's make sure this contract is fulfilled.
|
||||
There is no guarantee the serialized version will be smaller, e.g.
|
||||
[let x = Some 0 in (x, Array.init 254 (fun i -> Some i), x)]
|
||||
is smaller with no sharing.
|
||||
*)
|
||||
let reachable_words_normalized = Obj.reachable_words normalized in
|
||||
assert_bool "less reachable words" (reachable_words_normalized <= reachable_words_input) ;
|
||||
let eq =
|
||||
(* Cannot use [assert_equal] because it doesn't shortcut physical equalities *)
|
||||
Polymorphic_compare.equal input normalized
|
||||
in
|
||||
assert_bool "equal" eq ;
|
||||
(*
|
||||
In case structural equality and marshalling have slightly different semantics,
|
||||
let's also make sure the serialized versions are indistinguishable
|
||||
*)
|
||||
let serialized_normalized_no_sharing = Marshal.to_string normalized [Marshal.No_sharing] in
|
||||
assert_equal serialized_input_no_sharing serialized_normalized_no_sharing
|
||||
in
|
||||
let tests_ = List.map inputs ~f:(fun (name, input) -> name >:: test_one input) in
|
||||
"MaximumSharing_tests" >::: tests_
|
Loading…
Reference in new issue