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