/* ĊĠĠ ĠCopyright Ġ 2 0 1 7 - 2 0 2 0 ĠChar les ĠK orn . ĊĊĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); ĊĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĊĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat ĊĊĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 ĊĊĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware ĊĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĊĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĊĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand ĊĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ package Ġb ate ct . config Ċ Ċ import Ġb ate ct . config . io . ConfigurationException Ċ import Ġb ate ct . test utils . equalTo Ċ import Ġb ate ct . test utils . given Ċ import Ġb ate ct . test utils . on Ċ import Ġb ate ct . test utils . with Column Ċ import Ġb ate ct . test utils . with LineNumber Ċ import Ġb ate ct . test utils . with Message Ċ import Ġb ate ct . utils . Json Ċ import Ġcom . char les k orn . k aml . Yaml Ċ import Ġcom . nat pr y ce . ham k rest . and Ċ import Ġcom . nat pr y ce . ham k rest . assertion . assertThat Ċ import Ġcom . nat pr y ce . ham k rest . throws Ċ import Ġorg . spe k framework . spe k 2 . Spe k Ċ import Ġorg . spe k framework . spe k 2 . style . specification . describe Ċ Ċ object ĠPort Range Spec Ġ: ĠSpe k ({ ĊĠĠĠ Ġdescribe (" a Ġport Ġrange ") Ġ{ ĊĠĠĠĠĠĠĠ Ġdescribe (" creating Ġa Ġport Ġrange ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġa Ġport Ġrange Ġwith Ġa Ġsingle Ġport ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠPort Range ( 1 2 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" reports Ġa Ġsize Ġof Ġ 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( range . size , ĠequalTo ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġa Ġport Ġrange Ġwith Ġa Ġsingle Ġport Ġspecified Ġwith Ġas Ġan Ġinterval ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠPort Range ( 1 2 3 , Ġ 1 2 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" reports Ġa Ġsize Ġof Ġ 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( range . size , ĠequalTo ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġa Ġport Ġrange Ġwith Ġmultiple Ġports Ġport ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠPort Range ( 1 2 3 , Ġ 1 2 5 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" reports Ġa Ġsize Ġof Ġ 3 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( range . size , ĠequalTo ( 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġa Ġport Ġrange Ġwith Ġthe Ġfrom Ġand Ġto Ġport Ġinverted ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġappropriate Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠPort Range ( 1 0 0 , Ġ 5 0 ) Ġ}, Ġthrows < Invalid Port Range Exception >( with Message (" Port Ġrange Ġlimits Ġmust Ġbe Ġgiven Ġin Ġascending Ġorder . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġa Ġport Ġrange Ġwith Ġthe Ġfrom Ġport Ġset Ġto Ġ 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġappropriate Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠPort Range ( 0 , Ġ 5 0 ) Ġ}, Ġthrows < Invalid Port Range Exception >( with Message (" Ports Ġmust Ġbe Ġpositive Ġintegers . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" creating Ġa Ġport Ġrange Ġwith Ġthe Ġfrom Ġport Ġset Ġto Ġa Ġnegative Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġappropriate Ġexception ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠPort Range (- 1 , Ġ 5 0 ) Ġ}, Ġthrows < Invalid Port Range Exception >( with Message (" Ports Ġmust Ġbe Ġpositive Ġintegers . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdescribe (" parsing Ġand Ġde serializing Ġa Ġport Ġrange ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 3 " Ġto ĠPort Range ( 1 2 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 3 - 1 2 3 " Ġto ĠPort Range ( 1 2 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 3 - 4 5 6 " Ġto ĠPort Range ( 1 2 3 , Ġ 4 5 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġ( input , Ġexpected Value ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" the Ġinput Ġstring Ġ'$ input '") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" par ses Ġto Ġthe Ġexpected Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( Port Range . parse ( input ), ĠequalTo ( expected Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" de serial izes Ġto Ġthe Ġexpected Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( Yaml . default . parse ( Port Range . serializer (), Ġinput ), ĠequalTo ( expected Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 - a ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" a - 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 -", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" a ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- 1 - 1 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" the Ġinput Ġstring Ġ'$ input '") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġappropriate Ġexception Ġwhen Ġparsed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠPort Range . parse ( input ) Ġ}, Ġthrows < Invalid Port Range Exception >( with Message (" Port Ġrange Ġ'$ input ' Ġis Ġinvalid . ĠIt Ġmust Ġbe Ġin Ġthe Ġform Ġ' port ' Ġor Ġ' from - to ' Ġand Ġeach Ġport Ġmust Ġbe Ġa Ġpositive Ġinteger . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" de serial izes Ġto Ġthe Ġexpected Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠYaml . default . parse ( Port Range . serializer (), Ġinput ) Ġ}, Ġthrows < ConfigurationException >( with Message (" Port Ġrange Ġ'$ input ' Ġis Ġinvalid . ĠIt Ġmust Ġbe Ġin Ġthe Ġform Ġ' port ' Ġor Ġ' from - to ' Ġand Ġeach Ġport Ġmust Ġbe Ġa Ġpositive Ġinteger .") Ġand Ġwith LineNumber ( 1 ) Ġand Ġwith Column ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" an Ġempty Ġinput Ġstring ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġappropriate Ġexception Ġwhen Ġparsed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠPort Range . parse ("") Ġ}, Ġthrows < Invalid Port Range Exception >( with Message (" Port Ġrange Ġ'' Ġis Ġinvalid . ĠIt Ġmust Ġbe Ġin Ġthe Ġform Ġ' port ' Ġor Ġ' from - to ' Ġand Ġeach Ġport Ġmust Ġbe Ġa Ġpositive Ġinteger . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" de serial izes Ġto Ġthe Ġexpected Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠYaml . default . parse ( Port Range . serializer (), Ġ" '' ") Ġ}, Ġthrows < ConfigurationException >( with Message (" Port Ġrange Ġ'' Ġis Ġinvalid . ĠIt Ġmust Ġbe Ġin Ġthe Ġform Ġ' port ' Ġor Ġ' from - to ' Ġand Ġeach Ġport Ġmust Ġbe Ġa Ġpositive Ġinteger .") Ġand Ġwith LineNumber ( 1 ) Ġand Ġwith Column ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 - 1 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" the Ġinput Ġstring Ġ'$ input ' Ġrepresenting Ġan Ġinvalid Ġport Ġrange ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġappropriate Ġexception Ġwhen Ġparsed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠPort Range . parse ( input ) Ġ}, Ġthrows < Invalid Port Range Exception >( with Message (" Port Ġrange Ġ'$ input ' Ġis Ġinvalid . ĠPort s Ġmust Ġbe Ġpositive Ġintegers . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" de serial izes Ġto Ġthe Ġexpected Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠYaml . default . parse ( Port Range . serializer (), Ġinput ) Ġ}, Ġthrows < ConfigurationException >( with Message (" Port Ġrange Ġ'$ input ' Ġis Ġinvalid . ĠPort s Ġmust Ġbe Ġpositive Ġintegers .") Ġand Ġwith LineNumber ( 1 ) Ġand Ġwith Column ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" a Ġstring Ġwith Ġthe Ġfrom Ġand Ġto Ġport Ġinverted ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ" 1 2 3 - 1 2 2 " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" throws Ġan Ġappropriate Ġexception Ġwhen Ġparsed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠPort Range . parse ( input ) Ġ}, Ġthrows < Invalid Port Range Exception >( with Message (" Port Ġrange Ġ'$ input ' Ġis Ġinvalid . ĠPort Ġrange Ġlimits Ġmust Ġbe Ġgiven Ġin Ġascending Ġorder . "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" de serial izes Ġto Ġthe Ġexpected Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ({ ĠYaml . default . parse ( Port Range . serializer (), Ġinput ) Ġ}, Ġthrows < ConfigurationException >( with Message (" Port Ġrange Ġ'$ input ' Ġis Ġinvalid . ĠPort Ġrange Ġlimits Ġmust Ġbe Ġgiven Ġin Ġascending Ġorder .") Ġand Ġwith LineNumber ( 1 ) Ġand Ġwith Column ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdescribe (" serializing Ġand Ġformatting Ġa Ġport Ġrange Ġfor Ġdisplay ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" a Ġport Ġrange Ġwith Ġa Ġsingle Ġport ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠPort Range ( 1 2 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" con verts Ġto Ġthe Ġexpected Ġstring ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( range . toString (), ĠequalTo (" 1 2 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" serial izes Ġto Ġthe Ġexpected ĠJSON Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( Json . for Logging . stringify ( Port Range . serializer (), Ġrange ), ĠequalTo (" """ 1 2 3 """" )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven (" a Ġport Ġrange Ġwith Ġmultiple Ġports ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠPort Range ( 1 2 3 , Ġ 4 5 6 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" con verts Ġto Ġthe Ġexpected Ġstring ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( range . toString (), ĠequalTo (" 1 2 3 - 4 5 6 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" serial izes Ġto Ġthe Ġexpected ĠJSON Ġvalue ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( Json . for Logging . stringify ( Port Range . serializer (), Ġrange ), ĠequalTo (" """ 1 2 3 - 4 5 6 """" )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ