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

(*
* 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)