summaryrefslogtreecommitdiffstats
path: root/tests/version.rs
blob: ef58601bb401e6697577d06d2377f02564b9ac60 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use zagan_bet::version::{
    compatible, hello_line, is_newer, parse_hello, Version, VERSION,
};

#[test]
fn versions_parse_and_reject_nonsense() {
    assert_eq!(
        Version::parse("4.0.0"),
        Some(Version {
            major: 4,
            minor: 0,
            patch: 0
        })
    );
    assert_eq!(
        Version::parse("v4.1.2"),
        Some(Version {
            major: 4,
            minor: 1,
            patch: 2
        })
    );
    assert_eq!(
        Version::parse("4.0.0-rc1").map(|v| (v.major, v.minor, v.patch)),
        Some((4, 0, 0))
    );
    assert_eq!(
        Version::parse("4.0.0+build7").map(|v| v.patch),
        Some(0)
    );

    for bad in ["", "4", "4.0", "4.0.0.1", "x.0.0", "4.x.0", "4.0.0-"] {
        assert!(Version::parse(bad).is_none(), "{bad:?} should not parse");
    }

    assert!(Version::parse(VERSION).is_some(), "the build version must parse");
}

#[test]
fn compatibility_is_major_and_minor_only() {
    assert!(compatible("4.0.0", "4.0.9"));
    assert!(compatible("4.2.7", "4.2.1"));
    assert!(!compatible("4.0.0", "4.1.0"));
    assert!(!compatible("4.0.0", "5.0.0"));
    assert!(!compatible("nope", "4.0.0"));
}

#[test]
fn newer_versions_are_ordered_by_major_minor_patch() {
    assert!(is_newer("4.0.1", "4.0.0"));
    assert!(is_newer("4.1.0", "4.0.9"));
    assert!(is_newer("5.0.0", "4.9.9"));
    assert!(!is_newer("4.0.0", "4.0.0"));
    assert!(!is_newer("4.0.0", "4.0.1"));
    assert!(!is_newer("nonsense", "4.0.0"));
}

#[test]
fn the_hello_reply_round_trips() {
    let line = hello_line("4.0.0", "4.1.2", "https://zagan.example/");
    let reply = parse_hello(&line).expect("parse a generated reply");

    assert_eq!(reply.version, "4.0.0");
    assert_eq!(reply.latest, "4.1.2");
    assert_eq!(reply.url, "https://zagan.example/");

    assert!(parse_hello("HELLO 4.0.0 url=https://x/").is_none(), "latest is required");
    assert!(parse_hello("HELLO 4.0.0 latest=4.0.0").is_none(), "url is required");
    assert!(parse_hello("PONG").is_none());
    assert!(parse_hello("HELLO").is_none());
}