;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC Sucursal en España SL

(ns common-tests.uuid-test
  (:require
   [app.common.uuid :as uuid]
   [clojure.test :as t]))

(defn create-array
  [data]
  #?(:clj (byte-array data)
     :cljs (.from js/Int8Array (into-array data))))

(t/deftest bytes-roundtrip
  (let [uuid           (uuid/uuid "0227df82-63d7-8016-8005-48d9c0f33011")
        result-bytes   (uuid/get-bytes uuid)
        expected-bytes [2 39 -33 -126 99 -41 -128 22 -128 5 72 -39 -64 -13 48 17]]

    (t/testing "get-bytes"
      (let [data (uuid/get-bytes uuid)]
        (t/is (= (nth expected-bytes 0)  (aget data 0)))
        (t/is (= (nth expected-bytes 1)  (aget data 1)))
        (t/is (= (nth expected-bytes 2)  (aget data 2)))
        (t/is (= (nth expected-bytes 3)  (aget data 3)))
        (t/is (= (nth expected-bytes 4)  (aget data 4)))
        (t/is (= (nth expected-bytes 5)  (aget data 5)))
        (t/is (= (nth expected-bytes 6)  (aget data 6)))
        (t/is (= (nth expected-bytes 7)  (aget data 7)))
        (t/is (= (nth expected-bytes 8)  (aget data 8)))
        (t/is (= (nth expected-bytes 9)  (aget data 9)))
        (t/is (= (nth expected-bytes 10) (aget data 10)))
        (t/is (= (nth expected-bytes 11) (aget data 11)))
        (t/is (= (nth expected-bytes 12) (aget data 12)))
        (t/is (= (nth expected-bytes 13) (aget data 13)))
        (t/is (= (nth expected-bytes 14) (aget data 14)))
        (t/is (= (nth expected-bytes 15) (aget data 15)))))

    (t/testing "from-bytes"
      (let [data   (create-array expected-bytes)
            result (uuid/from-bytes data)]
        (t/is (= result uuid))))))


(t/deftest bytes-roundtrip-2
  (let [uuid           (uuid/uuid "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8")
        result-bytes   (uuid/get-bytes uuid)
        expected-hi    #?(:clj -6799692559624781374
                          :cljs (js/BigInt "-6799692559624781374"))
        expected-lo    #?(:clj -3327364263599220776
                          :cljs (js/BigInt "-3327364263599220776"))

        expected-bytes [-95, -94, -93, -92, -79, -78, -63, -62, -47, -46, -45, -44, -43, -42, -41, -40]]

    (t/testing "get-bytes"
      (let [data (uuid/get-bytes uuid)]
        (t/is (= (nth expected-bytes 0)  (aget data 0)))
        (t/is (= (nth expected-bytes 1)  (aget data 1)))
        (t/is (= (nth expected-bytes 2)  (aget data 2)))
        (t/is (= (nth expected-bytes 3)  (aget data 3)))
        (t/is (= (nth expected-bytes 4)  (aget data 4)))
        (t/is (= (nth expected-bytes 5)  (aget data 5)))
        (t/is (= (nth expected-bytes 6)  (aget data 6)))
        (t/is (= (nth expected-bytes 7)  (aget data 7)))
        (t/is (= (nth expected-bytes 8)  (aget data 8)))
        (t/is (= (nth expected-bytes 9)  (aget data 9)))
        (t/is (= (nth expected-bytes 10) (aget data 10)))
        (t/is (= (nth expected-bytes 11) (aget data 11)))
        (t/is (= (nth expected-bytes 12) (aget data 12)))
        (t/is (= (nth expected-bytes 13) (aget data 13)))
        (t/is (= (nth expected-bytes 14) (aget data 14)))
        (t/is (= (nth expected-bytes 15) (aget data 15)))))

    (t/testing "from-bytes"
      (let [data   (create-array expected-bytes)
            result (uuid/from-bytes data)]
        (t/is (= result uuid))))

    (t/testing "hi-low"
      (let [hi (uuid/get-word-high uuid)
            lo (uuid/get-word-low uuid)]

        (t/is (= hi expected-hi))
        (t/is (= lo expected-lo))))

    #?(:cljs
       (t/testing "unsigned-parts"
         (let [parts    (uuid/get-unsigned-parts uuid)
               expected [2711790500, 2981282242, 3520254932, 3587626968]]

           (t/is (instance? js/Uint32Array parts))
           (t/is (= (nth expected 0) (aget parts 0)))
           (t/is (= (nth expected 1) (aget parts 1)))
           (t/is (= (nth expected 2) (aget parts 2)))
           (t/is (= (nth expected 3) (aget parts 3))))))))
