ragit 0.4.5

git-like rag pipeline
Documentation
use super::{Uid, UidWriteMode};
use ragit_fs::remove_file;

const UID_SAMPLES: [Uid; 14] = [
    Uid { high: 0, low: 0 },
    Uid { high: 1, low: 0 },
    Uid { high: 0, low: 1 },
    Uid { high: 1, low: 1 },
    Uid { high: u64::MAX as u128, low: 0 },
    Uid { high: 0, low: u64::MAX as u128 },
    Uid { high: u64::MAX as u128, low: u64::MAX as u128 },
    Uid { high: u128::MAX, low: 0 },
    Uid { high: 0, low: u128::MAX },
    Uid { high: u128::MAX, low: u128::MAX },
    Uid { high: 5, low: 5 },
    Uid { high: 10, low: 5 },
    Uid { high: 5, low: 10 },
    Uid { high: 10, low: 10 },
];
// random generated uids
const REAL_WORLD_SAMPLES: [Uid; 128] = [
    Uid { high: 25302598638483048107888224174691313351, low: 102559651264812754386278007213480047368 },
    Uid { high: 84457674481242911153896506053154861413, low: 9382020025263775477464517119933505006 },
    Uid { high: 268480711456994528314589906433040395398, low: 129606863499088689857174563468511702332 },
    Uid { high: 145758652306353365656516786323172826080, low: 234153168860856931305572545097229990928 },
    Uid { high: 152655668544943112755410269537062091033, low: 285259135515284803827353645022215907411 },
    Uid { high: 248857391591309420527844043909379299935, low: 7711092198976323508445931147673834794 },
    Uid { high: 249086568106386292937328723719820176681, low: 225879940013840852645047574936700156528 },
    Uid { high: 40903400766961529878427036392890781621, low: 213581097118503466205261377691733643925 },
    Uid { high: 187772776292414316043597168121401325598, low: 178257482154450411180770799674892530862 },
    Uid { high: 316452105491167949497055707923096489524, low: 183234169111890618379884984386462842445 },
    Uid { high: 167361861274754783841699958171449269842, low: 270278556736056763785371598533495198683 },
    Uid { high: 81158430035017872952699090791447111385, low: 106753245732542304033952995821205696832 },
    Uid { high: 173463653570006302514452639678163250980, low: 92417452237214424473203225739815691675 },
    Uid { high: 117579722116448532780817903762033280972, low: 138243806786141521114940494462874407593 },
    Uid { high: 26536057689535727834655366581293314038, low: 338734068754873023432732727311284885609 },
    Uid { high: 90719642395716465672477559506447621703, low: 62324931800354382025561785347404846841 },
    Uid { high: 217301857258169428813230268658084383871, low: 317183127821012119371001099837267907428 },
    Uid { high: 22042704165255251087108710306308388674, low: 25282144222594338172271078834950115899 },
    Uid { high: 134190306314120598814848564054244690953, low: 21691418660385076379618292454042363753 },
    Uid { high: 108786884219862289248837961145845255268, low: 141312144576123436510615011059530352871 },
    Uid { high: 49704785332316360344165108704173316635, low: 251185156345269071881627251698599131888 },
    Uid { high: 244477428775059527150888387294929090360, low: 168883603139556162608030783578800592693 },
    Uid { high: 53847426060438501067504775691322172548, low: 335752619751746599043047231258978517486 },
    Uid { high: 60002056312643765576584190895379999080, low: 144482663784219423639222883343906261138 },
    Uid { high: 192062135190588923077321708769096824174, low: 246435330170620120419652251302804332730 },
    Uid { high: 18450123190642499908393703196523414306, low: 245706668391253126698828492960834283856 },
    Uid { high: 125835394737926256928536724864508753896, low: 5035543282419676388941779446996327178 },
    Uid { high: 140392333530539793362707663583806335902, low: 255443695648894504170052906067459459959 },
    Uid { high: 141468087488254366586240669859086285285, low: 242254510373981074775644107447816065551 },
    Uid { high: 80478565194530788385383540793395031292, low: 72642647594144275796189541070417424384 },
    Uid { high: 274390598501123629428430191058126478061, low: 197321357138757531213248560678033702363 },
    Uid { high: 112725970621288703831533607890466276213, low: 7046153607283887499956257951128056136 },
    Uid { high: 273285991266899442596761086501492858782, low: 336238086622690733164733025200497295807 },
    Uid { high: 84927722925819494493002934948213640862, low: 203940919962971286428338140183605614038 },
    Uid { high: 54085200702045485889569811679615703175, low: 296956564990959201958802505211219554501 },
    Uid { high: 202615881187057733509427408194126911665, low: 254813452466768308231996259760323402338 },
    Uid { high: 1584924846326242219595476712651413019, low: 153498003154239400312781148563741253632 },
    Uid { high: 129028976977581244580310880046746539630, low: 151328371526148853443001627277041470533 },
    Uid { high: 159876575459480956200143971123849464789, low: 272997576564551587905520265499975824329 },
    Uid { high: 233543397476652715222534212152628112905, low: 17097319832904416671040106584899008281 },
    Uid { high: 337917387623120097221952941308810896568, low: 323472117623372619653250308239240822737 },
    Uid { high: 87049122442805873098626456831196314610, low: 97362626955495796757777614285149807169 },
    Uid { high: 246067721643038378207826640001679185920, low: 220564764982480124050419247497259287861 },
    Uid { high: 120562125283638931571888574304981694555, low: 129818038111931831477759457569221319794 },
    Uid { high: 173970663922857919303761642360811985434, low: 100560653827854459315971932626724838597 },
    Uid { high: 270836745590265068418395693291380241627, low: 10709323432105847549001321596571805612 },
    Uid { high: 304995589557068612361070215123774121376, low: 224839510601188877152203556831432100260 },
    Uid { high: 256934649192759935845465417947447312868, low: 209042949152225512615268698733362451442 },
    Uid { high: 74422870213673568573485415735498499107, low: 194886492638547382224070418899346193930 },
    Uid { high: 132892240934656248530942519444381027939, low: 231638662070515580830449575230952778864 },
    Uid { high: 289155329883600870833613544675935721142, low: 207461197302787284554415112121374626527 },
    Uid { high: 170985264166706330522621641643191739712, low: 105277358862538400059968422027213517616 },
    Uid { high: 231968163231279872557150715583531120911, low: 41163836634336562156855183366966405311 },
    Uid { high: 173258791936376425663280626186550992647, low: 32432187490448063985381708609371131441 },
    Uid { high: 292346951168152617767482553292651613177, low: 264716829060540760740871344428281613842 },
    Uid { high: 266591783187946167395655914556742245535, low: 336910562000153205494876223462946575525 },
    Uid { high: 96743244286648311735230235589839346523, low: 264931782018616441188274268960784478466 },
    Uid { high: 122584953896682124825009940485698720269, low: 61943647118675720588663345672223235087 },
    Uid { high: 53201740528871308722957987492242015999, low: 297229279736575565025257218494226073511 },
    Uid { high: 29884042453731492170052738717184627135, low: 158388269214456309310875978251067824225 },
    Uid { high: 180739769677906649875707027107400376610, low: 23774034935558637771453833789771265064 },
    Uid { high: 22468187576026811167648696319211209702, low: 206668080587060303271071746828987100052 },
    Uid { high: 221874680647590372854709754282593042446, low: 270897541936298685504845360787983926138 },
    Uid { high: 269062799719635896814094763117690954823, low: 173199390354954442070699081247897535297 },
    Uid { high: 28737358603931562097220154722717598786, low: 193526557769139690162138588532402469206 },
    Uid { high: 239971105093989818240887833566066711222, low: 151749606940001366608347078752991347014 },
    Uid { high: 230582880650040763717026771487349922599, low: 196899293356901989713736334335577955327 },
    Uid { high: 244364408605882377753131927161889117733, low: 283279833064898656726732348090830958872 },
    Uid { high: 132803480673082553547107730858194404698, low: 106679531013795440059040044333283590235 },
    Uid { high: 149488536461246927122004872875507751639, low: 211159842723498616653543525636895816483 },
    Uid { high: 213795138420008498379014286514089651265, low: 330311605466054698588227032332339860462 },
    Uid { high: 8101281664440949272884662487894564819, low: 110081080492007498855117356370243046497 },
    Uid { high: 306876284539543449812285619028722013813, low: 297397152869041097036779907899099899673 },
    Uid { high: 46573520276589431334784844791910675664, low: 88415575686453839989251796720489987229 },
    Uid { high: 125092025349054234505231031365442832056, low: 69147482653861156678277181341707721675 },
    Uid { high: 7818283355718485152831071969410787969, low: 133020014714338977641723587588421167880 },
    Uid { high: 226303033249815197727932648864980380519, low: 204814942687094549049321009077167179756 },
    Uid { high: 78495462768943810061976078027728765074, low: 303738786473624484739443739109494931827 },
    Uid { high: 263874139421022845484311497471159060534, low: 261616035328754459782282795099018278707 },
    Uid { high: 205252558662793390003559235129163410206, low: 329243241509810872523450553663381781727 },
    Uid { high: 303689391443009729315483744963773326982, low: 23734513089630002373070252155950726260 },
    Uid { high: 302728387878014007925028863567664629474, low: 138717634706444435825062295599853544697 },
    Uid { high: 29853189674537987114100587376920834051, low: 162467480716721455636429390808093397470 },
    Uid { high: 75582412471315591490828162477658744185, low: 08432163185889402026477589864286738461 },
    Uid { high: 340041767627675838168489283108398093436, low: 241779999258719045238272690891627326297 },
    Uid { high: 252147520736104068968625288063707955784, low: 338265067525344882383099457714933582944 },
    Uid { high: 322633419945729547940532738559248952484, low: 224353898878366061926038548815183896616 },
    Uid { high: 97512383688101950996750615828498702455, low: 294451142061627547284860394931979535490 },
    Uid { high: 315020732095368332582752921931791578698, low: 45937717723429835854726163246797034014 },
    Uid { high: 318857213801312773299873757782395024699, low: 65099452973150684630103330416073738922 },
    Uid { high: 181814381517503914397855019787653423408, low: 133536897912425558876231443043152556972 },
    Uid { high: 321672783137209582580852463821548348656, low: 28666319685071317709864617214510492866 },
    Uid { high: 272731681154423225249824597306425973601, low: 335975505757219301550462611435392706143 },
    Uid { high: 323042671401281432262087751345540104365, low: 215089156570556635940251968240555233174 },
    Uid { high: 170160491779348523089848572645397262000, low: 178784206346351575832792885227334000113 },
    Uid { high: 128955926760684441981358329293362627759, low: 248955819788125599926717922843262677803 },
    Uid { high: 26610612479352076261582719663990780543, low: 257184359369682028796184708549085808063 },
    Uid { high: 281514439367281263769785868813036012911, low: 323462682240102052647858283056850346516 },
    Uid { high: 330116426499934250735604998597213719960, low: 160450260091837911434804900145012267198 },
    Uid { high: 271421035568545177878080657079734092606, low: 52596977878474507238197047626528921299 },
    Uid { high: 74589412702724307981551596706062735008, low: 339743387759034021045035262046268721832 },
    Uid { high: 332576585099259787350072731124432707269, low: 257311994965330272680899134477127811880 },
    Uid { high: 50534292571903544712058966568742455207, low: 228077954308396921531775992881483063716 },
    Uid { high: 217584343185829882521113085653449515785, low: 419674589556807554779260891407850304 },
    Uid { high: 226148836272441453339490377789561184071, low: 112247715931150517365968517595285101159 },
    Uid { high: 240535503197288982580917676694380497708, low: 307118307379592115754014685776383522217 },
    Uid { high: 156738232148116423508196709952081381635, low: 94285892455718783337722261493026118543 },
    Uid { high: 137927563793962586210111482314013952184, low: 31329942917869767260525494924588419 },
    Uid { high: 182871308609014839883902726019550964106, low: 242462944878160223273387152664064456678 },
    Uid { high: 108699046639181031898183894893881267803, low: 273028131630386602253822868858981474 },
    Uid { high: 328772418465737796086516603823298156787, low: 182121006974567783783493259531306932771 },
    Uid { high: 162298068192798505174421399059703706045, low: 27098005873535514604799374299580574461 },
    Uid { high: 217540638514629471712598831066241843867, low: 189362503152465586913645829184121553615 },
    Uid { high: 107273081384492157811535230515130892081, low: 153620487954257937144586491834432309233 },
    Uid { high: 35913510718749791172432633224349296563, low: 213437705981177731415721380871431577999 },
    Uid { high: 11831317073634344261850480852066229760, low: 51158436775796906100132958762435297710 },
    Uid { high: 275114334993661596476027747063984075114, low: 153237351177520845720179612651907465927 },
    Uid { high: 252980445658237508515275998543873587032, low: 277619067375432372539566878015343711610 },
    Uid { high: 54444454656560274428868259048849020520, low: 142589640989259268457141410672198845974 },
    Uid { high: 72532854491513459575311893788096219271, low: 730725144777256410997860 },
    Uid { high: 114857134751229833833319764155924293861, low: 324159736432950177718363740459467964151 },
    Uid { high: 257889253599709591375483733166781743788, low: 238132742768979873180166674134956559191 },
    Uid { high: 89357178697059736927567715337861071100, low: 255569407406801095500608560833386857129 },
    Uid { high: 106960321174709912129155650614069200167, low: 3599968333618190056734200288833 },
    Uid { high: 336747337176710522454263527092706960446, low: 231829736827539260483381194826373085374 },
    Uid { high: 228447049809873247433582917488134341999, low: 276743368492543115622663048099419500609 },
    Uid { high: 14839301132029839849398624441567659908, low: 134530496463773823199357593658514509529 },
    Uid { high: 338413058741249822743478356611488727400, low: 114725246103413315563091621712673 },
];

#[test]
fn uid_add_sub() {
    let samples = vec![
        UID_SAMPLES.to_vec(),
        REAL_WORLD_SAMPLES.to_vec(),
    ].concat();

    for a in samples.clone().into_iter() {
        for b in samples.clone().into_iter() {
            if a < b {
                assert!(a.checked_sub(b).is_none());
                continue;
            }

            let d = a.checked_sub(b).unwrap();
            assert_eq!(d + b, a);
        }
    }
}

#[test]
fn uid_save_and_load() {
    let samples = [
        vec![],
        UID_SAMPLES[..1].to_vec(),
        UID_SAMPLES[..4].to_vec(),
        UID_SAMPLES[..8].to_vec(),
        UID_SAMPLES.to_vec(),
        REAL_WORLD_SAMPLES[..8].to_vec(),
        REAL_WORLD_SAMPLES[..32].to_vec(),
        REAL_WORLD_SAMPLES.to_vec(),
        vec![
            UID_SAMPLES.to_vec(),
            REAL_WORLD_SAMPLES.to_vec(),
        ].concat(),
    ];

    for uids in samples {
        let mut sorted_uids = uids.to_vec();
        sorted_uids.sort();

        for write_mode in [
            UidWriteMode::Naive,
            UidWriteMode::Compact,
        ] {
            super::save_to_file(
                "./uid_test",
                &uids,
                write_mode,
            ).unwrap();
            let loaded = super::load_from_file("./uid_test").unwrap();
            remove_file("./uid_test").unwrap();

            match write_mode {
                UidWriteMode::Naive => { assert_eq!(uids, loaded); },
                UidWriteMode::Compact => { assert_eq!(sorted_uids, loaded); },
            }
        }
    }
}

#[test]
fn uid_endec() {
    let samples = vec![
        UID_SAMPLES.to_vec(),
        REAL_WORLD_SAMPLES.to_vec(),
    ].concat();

    for uid in samples.into_iter() {
        let mut buffer = vec![];
        let byte_len = uid.byte_len();

        uid.encode_partial(byte_len, &mut buffer);
        assert_eq!(Uid::decode_partial(&buffer).unwrap(), uid);

        if byte_len != 32 {
            buffer = vec![];
            uid.encode_partial(byte_len + 1, &mut buffer);
            assert_eq!(Uid::decode_partial(&buffer).unwrap(), uid);
        }

        if byte_len != 0 {
            buffer = vec![];
            uid.encode_partial(byte_len - 1, &mut buffer);
            assert!(Uid::decode_partial(&buffer).unwrap() != uid);
        }
    }
}