From 2fe2e8cdbc3bb520994ff0944188f2fa657c546a Mon Sep 17 00:00:00 2001 From: salmonik Date: Sun, 1 Nov 2026 17:49:08 +0100 Subject: v4.0.0: require HELLO MAJOR.MINOR lockstep before auth --- tests/version.rs | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 tests/version.rs (limited to 'tests/version.rs') diff --git a/tests/version.rs b/tests/version.rs new file mode 100644 index 0000000..ef58601 --- /dev/null +++ b/tests/version.rs @@ -0,0 +1,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()); +} -- cgit v1.2.3