\n <\/td>\n | package<\/span> com<\/span>.atomicobject<\/span>.tdd<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | import<\/span> org<\/span>.junit<\/span>.Test<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | import<\/span> java<\/span>.util<\/span>.HashMap<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | import<\/span> static<\/span> org<\/span>.hamcrest<\/span>.CoreMatchers<\/span>.not<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | import<\/span> static<\/span> org<\/span>.hamcrest<\/span>.CoreMatchers<\/span>.nullValue<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | import<\/span> static<\/span> org<\/span>.hamcrest<\/span>.core<\/span>.Is<\/span>.is<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | import<\/span> static<\/span> org<\/span>.junit<\/span>.Assert<\/span>.assertFalse<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | import<\/span> static<\/span> org<\/span>.junit<\/span>.Assert<\/span>.assertThat<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | import<\/span> static<\/span> org<\/span>.junit<\/span>.Assert<\/span>.assertTrue<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | public<\/span> class<\/span> MoneyTest<\/span> {<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | interface<\/span> Currency<\/span><T<\/span> extends<\/span> Currency<\/span><T<\/span>>> {<\/td>\n <\/tr>\n \n <\/td>\n | public<\/span> Money<\/span><T<\/span>> money<\/span>(double<\/span> amount<\/span>);<\/td>\n <\/tr>\n \n <\/td>\n | }<\/td>\n <\/tr>\n | \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | interface<\/span> ExchangableCurrency<\/span><T<\/span> extends<\/span> ExchangableCurrency<\/span><T<\/span>>> extends<\/span> Currency<\/span><T<\/span>> {<\/td>\n <\/tr>\n \n <\/td>\n | }<\/td>\n <\/tr>\n | \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | static<\/span> public<\/span> class<\/span> Money<\/span><T<\/span> extends<\/span> Currency<\/span><T<\/span>>> implements<\/span> Currency<\/span><T<\/span>> {<\/td>\n <\/tr>\n \n <\/td>\n | final<\/span> public<\/span> double<\/span> amount<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | public<\/span> T<\/span> currency<\/span>() { return<\/span> null<\/span>; }<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | public<\/span> Money<\/span>(double<\/span> amount<\/span>) { this<\/span>.amount<\/span> = amount<\/span>; }<\/td>\n <\/tr>\n \n <\/td>\n | public<\/span> Money<\/span><T<\/span>> money<\/span>(double<\/span> amount<\/span>) { return<\/span> new<\/span> Money<\/span><T<\/span>>(amount<\/span>); }<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | public<\/span> Money<\/span><T<\/span>> add<\/span>(Money<\/span><T<\/span>> other<\/span>) { return<\/span> money<\/span>(amount<\/span> + other<\/span>.amount<\/span>); }<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | @<\/span>Override<\/span><\/td>\n <\/tr>\n \n <\/td>\n | public<\/span> boolean<\/span> equals<\/span>(Object<\/span> o<\/span>) {<\/td>\n <\/tr>\n \n <\/td>\n | if<\/span> (this<\/span> == o<\/span>) {<\/td>\n <\/tr>\n \n <\/td>\n | return<\/span> true<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | }<\/td>\n <\/tr>\n | \n <\/td>\n | if<\/span> (o<\/span> == null<\/span> || getClass<\/span>() != o<\/span>.getClass<\/span>()) {<\/td>\n <\/tr>\n \n <\/td>\n | return<\/span> false<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | }<\/td>\n <\/tr>\n | \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | Money<\/span> money<\/span> = (Money<\/span>) o<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | if<\/span> (Double<\/span>.compare<\/span>(money<\/span>.amount<\/span>, amount<\/span>) != 0<\/span>) {<\/td>\n <\/tr>\n \n <\/td>\n | return<\/span> false<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | }<\/td>\n <\/tr>\n | \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | return<\/span> true<\/span>;<\/td>\n <\/tr>\n \n <\/td>\n | }<\/td>\n <\/tr>\n | \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | @<\/span>Override<\/span><\/td>\n <\/tr>\n \n <\/td>\n | public<\/span> int<\/span> hashCode<\/span>() {<\/td>\n <\/tr>\n \n <\/td>\n | long<\/span> temp<\/span> = Double<\/span>.doubleToLongBits<\/span>(amount<\/span>);<\/td>\n <\/tr>\n \n <\/td>\n | return<\/span> ( | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |