You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.4 KiB
75 lines
2.4 KiB
(*
|
|
* Copyright (c) 2017 - present Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*)
|
|
open! IStd
|
|
|
|
(* version macros like kCFCoreFoundationVersionNumber_iOS_9_0 are
|
|
tied to specific float values, e.g. 1240.1.
|
|
To be found in CoreFoundation/CFBase.h *)
|
|
|
|
type machine_readable_version = float
|
|
type human_readable_version = string
|
|
type t = machine_readable_version * human_readable_version
|
|
|
|
let version_numbers : t list =
|
|
[(478.23, "2.0");
|
|
(478.26, "2.1");
|
|
(478.29, "2.2");
|
|
(478.47, "3.0");
|
|
(478.52, "3.1");
|
|
(478.61, "3.2");
|
|
(550.32, "4.0");
|
|
(550.38, "4.1");
|
|
(550.52, "4.3");
|
|
(675.00, "5.0");
|
|
(690.10, "5.1");
|
|
(793.00, "6.1");
|
|
(847.20, "7.0");
|
|
(847.24, "7.1");
|
|
(1140.1, "8.0");
|
|
(1141.14, "8.1");
|
|
(1142.16, "8.2");
|
|
(1144.17, "8.3");
|
|
(1145.15, "8.4");
|
|
(1240.1, "9.0");
|
|
(1241.11, "9.1");
|
|
(1242.13, "9.3");
|
|
(1280.38, "9.4");
|
|
(1348.0, "10.0");
|
|
(1348.22, "10.2");]
|
|
|
|
let sort_versions versions =
|
|
let compare (version_float1, _) (version_float2, _) =
|
|
Float.compare version_float1 version_float2 in
|
|
List.sort ~cmp:compare versions
|
|
|
|
let version_of number_s : human_readable_version option =
|
|
let epsilon = 0.001 in
|
|
let rec version_of_aux version_numbers number =
|
|
match version_numbers with
|
|
| (version_n, version_s) :: (next_version_n, next_version_s) :: rest ->
|
|
if (number -. version_n) < epsilon && (number -. version_n) > -. epsilon then Some version_s
|
|
else if (number >= (version_n +. epsilon) && number <= (next_version_n -. epsilon))
|
|
then Some next_version_s
|
|
else version_of_aux ((next_version_n, next_version_s) :: rest) number
|
|
| [version_n, version_s] ->
|
|
if number >= version_n then Some version_s
|
|
else None
|
|
| [] -> None in
|
|
let number_opt =
|
|
try Some (float_of_string number_s)
|
|
with Failure _ -> None in
|
|
match number_opt with
|
|
| None -> None
|
|
| Some number -> version_of_aux (sort_versions version_numbers) number
|
|
|
|
let pp_diff_of_version_opt fmt (expected, actual) =
|
|
let option_to_string opt = Option.value ~default:"" opt in
|
|
Format.fprintf fmt
|
|
"Expected: [%s] Found: [%s]" (option_to_string expected) (option_to_string actual)
|