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.

82 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)