Skip to content

Instantly share code, notes, and snippets.

@MichaelDrogalis
Created May 14, 2012 23:55
Show Gist options
  • Select an option

  • Save MichaelDrogalis/2698163 to your computer and use it in GitHub Desktop.

Select an option

Save MichaelDrogalis/2698163 to your computer and use it in GitHub Desktop.
(ns distance.test.miles
(:use [clojure.test])
(:require [distance.units])
(:import [distance.units Miles])
(:import [distance.units Kilometers])
(:import [distance.units Meters])
(:use [distance.units]))
(deftest miles-to-miles
(is
(= (to-miles (Miles. 5)) (Miles. 5))
"Converting miles to miles returned a different length."))
(deftest miles-to-km
(is
(= (to-km (Miles. 1)) (Kilometers. 1.609))
"Converting miles to kilometers failed."))
(deftest miles-to-meters
(is
(= (to-meters (Miles. 1)) (Meters. 1609))
"Converting miles to meters failed."))
(deftest km-to-km
(is
(= (to-km (Kilometers. 5)) (Kilometers. 5))
"Converting kilometers to kilometers returned a different length."))
(deftest km-to-miles
(is
(= (to-miles (Kilometers. 1.609)) (Miles. 1))
"Converting kilometers to miles failed."))
(deftest km-to-meters
(is
(= (to-meters (Kilometers. 1)) (Meters. 1000))
"Converting kilometers to meters failed."))
(deftest meters-to-meters
(is
(= (to-meters (Meters. 500)) (Meters. 500))
"Converting meters to meters failed."))
(deftest meters-to-kilometers
(is
(= (to-km (Meters. 1000)) (Kilometers. 1))
"Converting meters to kilometers failed."))
(deftest meters-to-miles
(is
(= (to-miles (Meters. 1609)) (Miles. 1))
"Converting meters to miles failed."))
(ns distance.units)
(def *miles-meters-ratio* 1.609)
(def *metric-ratio* 1000)
(defrecord Miles [length])
(defrecord Kilometers [length])
(defrecord Meters [length])
(defprotocol Convertable
(to-miles [this])
(to-km [this])
(to-meters [this]))
(extend-type Miles
Convertable
(to-miles [this] (Miles. (:length this)))
(to-km [this] (Kilometers. (* (:length this) *miles-meters-ratio*)))
(to-meters [this] (to-meters (to-km this))))
(extend-type Kilometers
Convertable
(to-miles [this] (Miles. (/ (:length this) *miles-meters-ratio*)))
(to-km [this] (Kilometers. (:length this)))
(to-meters [this] (Meters. (* (:length this) *metric-ratio*))))
(extend-type Meters
Convertable
(to-miles [this] (to-miles (to-km this)))
(to-km [this] (Kilometers. (/ (:length this) *metric-ratio*)))
(to-meters [this] this))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment