lz-string 0.1.1

implementation of lz-string decompression
Documentation
use lz_string::{Decoder, Error};

macro_rules! test {
    ($data:expr, $expected:expr $(,)?) => {
        let mut decoder = Decoder::new();
        let result = decoder.decode_base64($data);

        assert_eq!(result, Ok($expected.to_owned()));
    }
}

#[test]
fn simple() {
    test!("IZA", "a");
}

#[test]
fn repeat1() {
    test!("IbI", "aa");
}

#[test]
fn repeat2() {
    test!("Aco", "ààà");
}

#[test]
fn repeat3() {
    test!("Ac1A", "àààààà");
}

#[test]
fn incomplete() {
    test!("C4e1Q", "toto");
}

#[test]
fn padded() {
    test!("C4e1Q===", "toto");
}

#[test]
fn utf16() {
    test!("KORCJCIEBFhgRAU4WASCwiQ1ESCBvwjIBA", "Å∑⁄¢∆Ê‚√∫flı");
}

#[test]
fn common() {
    test!(
        "MYUwBALgTghglgOzCAzhMADsATVFEz4D2CQA",
         "ce train est à destination",
    );
}

#[test]
fn medium() {
    test!(
        "MIUwBALgTghglgOzCAzhMADsATVFEz4D2SuYACgIIBKAkgMpj2W0ByAKmADKUBaNAUQBcYAGpEArimRIAVxFSYwAFgCsAUgDcYAPIS4YAMYByPJCgAL6QBsSAcwB0QA",
        "Ce train est à destination de PARIS SAINT LAZARE: Vous en êtes à 45%; Oui c'est très long.",
    );
}

#[test]
fn long() {
    test!(
        "N4IglgJiA0IIwCYDMAWArKgbAtOUxAEMAXGBWYgW0IA8ZEAGWMSgBxgG1RIC4CAjQgDshAUwBOMUAHd6aABxJYAC3oMAnGlisA9gGcYAdliDixSdA5wkAXQC+d6AAJuUWAgHCxFmUfkoVNSYQXQNoAJBTc05rezsbE0IIADdOEABjHTZhAE84ADpMygIi1lyEQqyQBJA9MGJRKXA3EGR0TCQCIUJKRtgAZXrRJwBBACEAYQARAggswjAhAmkV/MIAV3TlYQhxMGTRfIAzCxDCAHNRdJI0pEMGBkw4BmrYPSviMB0ha9JLEDuD2w+BqrD2yUI6RyugANmAofRtBc+iBlGZWNAAPSYuoNQj8dIQSqUTFlS75NHFWDiURHAho4gY7E0o4SPZCc64w5FTEstmLc5kw6Ugisdb8OF6ZQSJo8bTixCoNBdHoogAK4sl0vEoxAjgy3waQj+oAA1qIctIdOIIGEOCBzZbrRAnIQCI6rTanPx3RbPS70tUHLAIKJkvC+tx2LBMCh8og4zgkPGCOs3bAALI6ABeYBhMMImLQ+QYTgAFBnIYtiPplABuJwAVQbAEljaIYU5K+knAB5fpOAAaTme+UwDdEQgAtI3+g3xMloAV1PkKnBMABKJwAcSupp0mIQDDgzyQcHUTgAYmAWToaJjk5h45gCPoCP2hwQjgWpQdTqO+FgAArMI4H1dZ3h8ZoCHQQg9AgI51HkQxMDQTBDHkdQkiOJIUHQ+QaWkVD8PUAR1hyCR1jlEA0AQ/C4IgTDkOIhijgwpCULQfAQxIdMuBAbpegIEZNm2IQpnBPonFqURzl6Y1OFAQSUUEPRzT+aSIRhdYUQ4Gw9XsOIgA===",
        "{\"id\",\"1234534625254\",\"at\",2,\"tmax\",120,\"imp\",[{\"id\",\"1\",\"banner\",{\"w\",1583,\"h\",1095,\"pos\",7,\"battr\",[13]}}, {\"id\",\"2\",\"banner\",{\"w\",784,\"h\",100,\"pos\",4,\"battr\",[13]}}],\"badv\",[\"company1.com\",\"company2.com\"],\"site\",{\"id\",\"234563\",\"name\",\"Site ABCD\",\"domain\",\"www.auchandrive.fr\",\"pagecat\",[\"3700610\"],\"sectioncat\",[\"3700624\"],\"privacypolicy\",1,\"page\",\"http,//siteabcd.com/page.htm\",\"ref\",\"http,//referringsite.com/referringpage.htm\",\"publisher\",{\"id\",\"pub12345\",\"name\",\"Publisher A\"},\"content\",{\"keywords\",[\"keyword a\",\"keyword b\",\"keyword c\"]}},\"device\",{\"ip\",\"64.124.253.1\",\"ua\",\"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv,1.9.2.16) Gecko/20110319 Firefox/3.6.16\",\"os\",\"OS X\",\"flashver\",\"10.1\",\"js\",1},\"user\",{\"id\",\"45asdf987656789adfad4678rew656789\",\"buyeruid\",\"5df678asd8987656asdf78987654\",\"data\",[{\"name\",\"AuchanDrive\", \"segment\",[{\"name\",\"basket\", \"value\",\"[]\"}]}]}}",
    );
}

#[test]
fn invalid() {
    let data = "*";
    let expected = Err(Error::InvalidByte(0x2A));

    let mut decoder = Decoder::new();

    assert_eq!(decoder.decode_base64(data), expected);
}