### ----------------------------------------------------
### -- BigRoot
### -- Licenses: Artistic-2.0
### -- Authors: Julio
### -- File: t/01-first-sqrt2-sqrt3-high-precision.t
### ----------------------------------------------------
### -- Chunk 1 of 6
use BigRoot;
use Test;

BigRoot.precision = 20_076;

my Duration $sqrt2-duration;

plan 2;

subtest 'It calculates roots with high precision' => {
    plan 2;

    my Instant $start = now;
    ok BigRoot.newton's-sqrt(2) eq sqrt2, 'First 20,076 sqrt(2) digits are correct';
    $sqrt2-duration := now - $start;

    ok BigRoot.newton's-sqrt(3) eq sqrt3, 'First 20,076 sqrt(3) digits are correct';
}

subtest 'Cache works as expected' => {
    plan 2;

    constant $MAX_TRIES := 100;
    my Instant $start = now;
    for ^$MAX_TRIES {
        BigRoot.newton's-sqrt: 2;
        BigRoot.newton's-sqrt: 3;
    }
    ok (now - $start) < $sqrt2-duration, 'Cached results are not calculated again';

    BigRoot.use-cache = False;
    $start = now;
    BigRoot.newton's-sqrt: 2;
    BigRoot.newton's-sqrt: 3;
    ok (now - $start) > $sqrt2-duration, 'Do not use cache entries when cache is disabled';
}

done-testing;

sub sqrt2 {
    # From: https://apod.nasa.gov/htmltest/gifcity/sqrt2.1mil
    # Note that last digit (20_076) is rounded up
    return q:to/SQRT2/.subst( / \s+ | '0'+ \s* $ /, ｢｣, :g )
          1.4142135623730950488016887242096980785696718753769480731766797379907324784621
        07038850387534327641572735013846230912297024924836055850737212644121497099935831
        41322266592750559275579995050115278206057147010955997160597027453459686201472851
        74186408891986095523292304843087143214508397626036279952514079896872533965463318
        08829640620615258352395054745750287759961729835575220337531857011354374603408498
        84716038689997069900481503054402779031645424782306849293691862158057846311159666
        87130130156185689872372352885092648612494977154218334204285686060146824720771435
        85487415565706967765372022648544701585880162075847492265722600208558446652145839
        88939443709265918003113882464681570826301005948587040031864803421948972782906410
        45072636881313739855256117322040245091227700226941127573627280495738108967504018
        36986836845072579936472906076299694138047565482372899718032680247442062926912485
        90521810044598421505911202494413417285314781058036033710773091828693147101711116
        83916581726889419758716582152128229518488472089694633862891562882765952635140542
        26765323969461751129160240871551013515045538128756005263146801712740265396947024
        03005174953188629256313851881634780015693691768818523786840522878376293892143006
        55869568685964595155501644724509836896036887323114389415576651040883914292338113
        20605243362948531704991577175622854974143899918802176243096520656421182731672625
        75395947172559346372386322614827426222086711558395999265211762526989175409881593
        48640083457085181472231814204070426509056532333398436457865796796519267292399875
        36661721598257886026336361782749599421940377775368142621773879919455139723127406
        68983299898953867288228563786977496625199665835257761989393228453447356947949629
        52168891485492538904755828834526096524096542889394538646625744927556381964410316
        97983306185201937938494005715633372054806854057586799967012137223947582142630658
        51322174088323829472876173936474678374319600015921888073478576172522118674904249
        77366929207311096369721608933708661156734585334833295254675851644710757848602463
        60083444911481858765555428645512331421992631133251797060843655970435285641008791
        85007603610091594656706768836055717400767569050961367194013249356052401859991050
        62108163597726431380605467010293569971042425105781749531057255934984451126922780
        34491350663756874776028316282960553242242695753452902883876844642917328277088831
        80870253398523381227499908123718925407264753678503048215918018861671089728692292
        01197599880703818543332536460211082299279293072871780799888099176741774108983060
        80032631181642798823117154363869661702999934161614878686018045505553986913115186
        01038637532500455818604480407502411951843056745336836136745973744239885532851793
        08960373898915173195874134428817842125021916951875593444387396189314549999906107
        58704909026088351763622474975785885836803745793115733980209998662218694992259591
        32764236194105921003280261498745665996888740679561673918595728886424734635858868
        64496822386006983352642799056283165613913942557649062065186021647263033362975075
        69787060660685649816009271870929215313236828135698893709741650447459096053747279
        65244770940992412387106144705439867436473384774548191008728862221495895295911878
        92149179833981083788278153065562315810360648675873036014502273208829351341387227
        68417667843690529428698490838455744579409598626074249954916802853077398938296036
        21335398753205091998936075139064444957684569934712763645071632791547015977335486
        38939423257277540038260274785674172580951416307159597849818009443560379390985590
        16827215403458158152100493666295344882710729239660232163823826661262683050257278
        11694510353793715688233659322978231929860646797898640920856095581426143636310046
        15594332550474493975933999125419532300932175304476533964706627611661753518754646
        20967634558738616488019884849747926404506544489691004079421181692579685756378488
        14989864168549949163576144840470210339892153423770372333531156459443897036531667
        21949049351882905806307401346862641672470110653463493916407146285567980177933814
        42404526913706660977763878486623800339232437047411533187253190601916599645538115
        78884138084332321053376746181217801429609283241136275254088737290512940733947943
        30619439569367020794295158782283493219316664111301549594698378977674344435393377
        09957134988407890850815892366070088658105470949790465722988880892461282816013133
        70102908029099974564784958154561464871551639050241985790613109345878330620026220
        73724716766854554999049940857108099257599288932366154382719550057816251330381531
        46577907926868500806984428479152424275441026805756321565322061885751225113063937
        02536292716196825125919202521605870118959673224423926742373449076464672737534796
        45988191498079317180024238554538860383683108007791824664627541174442500187277795
        18164383451463461299020763343017968554385631667723518389336667042222110939144930
        28796381283988931173130843004212555018549850652945563776603146125590910461138476
        82823595924772286290426427361632645854433928772638603431498048963973633297548859
        25681149296836126725898573833216436663487023477302610106130507298611534129948808
        77447311122954265275165366591173014236062652586907719821703709810464436047722673
        92829874152593069562063847108274082184906737233058743029709242899481739244078693
        75284401044399048520878851914193541512900681735170306938697059004742515765524807
        84473621441050162008454441222559562029847259403528019067980680983003964539856859
        30458625260637797453559927747299064888745451242496076378010863900191058092874764
        72075110923860595019543228160208879621516233852161287522851802529287618325703717
        28574067639449098254644221846543088066105802015847284067126302545937989065081685
        71371656685941300533197036596403376674146104956376510308366134893109478026812935
        57331890551970520184515039969098663152512411611192594055280856498931958983456233
        19836834948808061715624391128663127978483719789533690152776005498055166350197855
        57110140555297633841275044686046476631832661165182067501204766991098721910444744
        03268943641595942792199442355371870429955924031409171284815854386600538571358363
        98163094524075570093251682434416824083619792733728252154622469615332170268299509
        79089034594858878349439616204358422497397187113958927305092197054917176961600445
        58089942787888036916943289459514722672292612485069617316380941082186004528610269
        65475763043102560271523139694821355198214097165490973199928349256740974903922971
        26348693414574933198041718076111963902278664075922434167762466236238913110270343
        30457636814112832132630858223945621959808661293999620123415617631817431242008901
        49838485604808798646083935964923665142968125773143229145687168276219961182782695
        31574983802624651759054103976181287604216386134502213262727756612441133610775195
        55774950865636067378665062318564069912280187574178549466125327599769796059776059
        07564891066610158384172028185304321190446577525542775437987260548817361982675816
        86283295260789932226683602838513512281059318591028641508157056319717315183136250
        24359041463212239217663398268936825315053005989154702909537193266207341123494743
        36788469020139049784285216341442921458955828784766939464642678122190497856363552
        63368278051860098699248937786002398769169807656621943898544370805946433362333810
        58745816235475600136592435242657143083465545768002370814675732525470255074763747
        16350678515991736937932510326827606286459146182047214863703707719269268236233347
        20379245964691810526139153086280291440965482563873092730426544662929045896063751
        91871146934536197332478957270703153093090192119919999361576500350398405406742538
        79275279227247335667706078379113844889362613676570602636003151329520953952028548
        973844862561349244147086070866026763499787934208