(local subject (require :acquire-wan-address))
(local { : view } (require :fennel))
(local { : merge : dup } (require :anoia))


(local a1
       {
        "2001-ab-cd-ef_hjgKHGhKJH" {
                                    :address "2001:ab:cd:ef"
                                    :len "64"
                                    :preferred "200"
                                    :valid "200"
                                    }
        }
       )

(local a2
       {
        "2001-0-1-2-3_aNteBnb" {
                                :address "2001:0:1:2:3"
                                :len "64"
                                :preferred "200"
                                :valid "200"
                                }
        }
       )

(macro expect [assertion]
  (let [msg (.. "expectation failed: " (view assertion))]
    `(when (not ,assertion)
       (assert false ,msg))))

(fn first-address []
  (let [(add del)
        (subject.changes
         { }
         a1
         )]
    (expect (= (# del) 0))
    (expect (= (# add) 1))
    (let [[first] add]
      (expect (= first.address "2001:ab:cd:ef")))))

(fn second-address []
  (let [(add del)
        (subject.changes
         a1
         (merge (dup a1) a2)
         )]
    (expect (= (# del) 0))
    (expect (= (# add) 1))
    (let [[first] add] (expect (= first.address  "2001:0:1:2:3")))))

(fn less-address []1
  (let [(add del)
        (subject.changes
         (merge (dup a1) a2)
         a1
         )]
    (expect (= (# add) 0))
    (expect (= (# del) 1))

    (let [[first] del] (expect (= first.address  "2001:0:1:2:3")))))


(first-address)
(second-address)
(less-address)