pub const HELP_TEXT: u16 = 100;
pub const CAPABILITY_LIST: u16 = 101;
pub const SERVER_DATE: u16 = 111;
pub const POSTING_ALLOWED: u16 = 200;
pub const NO_POSTING: u16 = 201;
pub const CONNECTION_CLOSING: u16 = 205;
pub const GROUP_SELECTED: u16 = 211;
pub const INFORMATION_FOLLOWS: u16 = 215;
pub const ARTICLE_FOLLOWS: u16 = 220;
pub const HEAD_FOLLOWS: u16 = 221;
pub const BODY_FOLLOWS: u16 = 222;
pub const ARTICLE_EXISTS: u16 = 223;
pub const OVERVIEW_FOLLOWS: u16 = 224;
pub const HEADERS_FOLLOW: u16 = 225;
pub const NEW_ARTICLES_FOLLOW: u16 = 230;
pub const NEW_GROUPS_FOLLOW: u16 = 231;
pub const AUTH_ACCEPTED: u16 = 281;
pub const COMPRESSION_ACTIVE: u16 = 206;
pub const SEND_ARTICLE_TRANSFER: u16 = 335;
pub const SEND_ARTICLE_POST: u16 = 340;
pub const PASSWORD_REQUIRED: u16 = 381;
pub const SASL_CONTINUE: u16 = 383;
pub const SERVICE_UNAVAILABLE: u16 = 400;
pub const INTERNAL_FAULT: u16 = 403;
pub const NO_SUCH_GROUP: u16 = 411;
pub const NO_GROUP_SELECTED: u16 = 412;
pub const NO_CURRENT_ARTICLE: u16 = 420;
pub const NO_NEXT_ARTICLE: u16 = 421;
pub const NO_PREV_ARTICLE: u16 = 422;
pub const NO_SUCH_ARTICLE_NUMBER: u16 = 423;
pub const NO_SUCH_ARTICLE_ID: u16 = 430;
pub const AUTH_REQUIRED: u16 = 480;
pub const AUTH_REJECTED: u16 = 481;
pub const AUTH_OUT_OF_SEQUENCE: u16 = 482;
pub const ENCRYPTION_REQUIRED: u16 = 483;
pub const COMMAND_NOT_RECOGNIZED: u16 = 500;
pub const COMMAND_SYNTAX_ERROR: u16 = 501;
pub const ACCESS_DENIED: u16 = 502;
pub const FEATURE_NOT_SUPPORTED: u16 = 503;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_1xx_informational_range() {
assert!((100..200).contains(&HELP_TEXT));
assert!((100..200).contains(&CAPABILITY_LIST));
assert!((100..200).contains(&SERVER_DATE));
}
#[test]
fn test_2xx_success_range() {
let codes = [
POSTING_ALLOWED,
NO_POSTING,
CONNECTION_CLOSING,
GROUP_SELECTED,
INFORMATION_FOLLOWS,
ARTICLE_FOLLOWS,
HEAD_FOLLOWS,
BODY_FOLLOWS,
ARTICLE_EXISTS,
OVERVIEW_FOLLOWS,
HEADERS_FOLLOW,
NEW_ARTICLES_FOLLOW,
NEW_GROUPS_FOLLOW,
AUTH_ACCEPTED,
COMPRESSION_ACTIVE,
];
for code in codes {
assert!((200..300).contains(&code), "Code {code} should be 2xx");
}
}
#[test]
fn test_3xx_continuation_range() {
let codes = [
SEND_ARTICLE_TRANSFER,
SEND_ARTICLE_POST,
PASSWORD_REQUIRED,
SASL_CONTINUE,
];
for code in codes {
assert!((300..400).contains(&code), "Code {code} should be 3xx");
}
}
#[test]
fn test_4xx_temporary_error_range() {
let codes = [
SERVICE_UNAVAILABLE,
INTERNAL_FAULT,
NO_SUCH_GROUP,
NO_GROUP_SELECTED,
NO_CURRENT_ARTICLE,
NO_NEXT_ARTICLE,
NO_PREV_ARTICLE,
NO_SUCH_ARTICLE_NUMBER,
NO_SUCH_ARTICLE_ID,
AUTH_REQUIRED,
AUTH_REJECTED,
AUTH_OUT_OF_SEQUENCE,
ENCRYPTION_REQUIRED,
];
for code in codes {
assert!((400..500).contains(&code), "Code {code} should be 4xx");
}
}
#[test]
fn test_5xx_permanent_error_range() {
let codes = [
COMMAND_NOT_RECOGNIZED,
COMMAND_SYNTAX_ERROR,
ACCESS_DENIED,
FEATURE_NOT_SUPPORTED,
];
for code in codes {
assert!((500..600).contains(&code), "Code {code} should be 5xx");
}
}
#[test]
fn test_specific_code_values() {
assert_eq!(SERVICE_UNAVAILABLE, 400);
assert_eq!(INTERNAL_FAULT, 403);
assert_eq!(NO_SUCH_GROUP, 411);
assert_eq!(NO_GROUP_SELECTED, 412);
assert_eq!(NO_CURRENT_ARTICLE, 420);
assert_eq!(NO_NEXT_ARTICLE, 421);
assert_eq!(NO_PREV_ARTICLE, 422);
assert_eq!(NO_SUCH_ARTICLE_NUMBER, 423);
assert_eq!(NO_SUCH_ARTICLE_ID, 430);
assert_eq!(AUTH_REQUIRED, 480);
assert_eq!(AUTH_REJECTED, 481);
assert_eq!(AUTH_OUT_OF_SEQUENCE, 482);
assert_eq!(ENCRYPTION_REQUIRED, 483);
assert_eq!(COMMAND_NOT_RECOGNIZED, 500);
assert_eq!(COMMAND_SYNTAX_ERROR, 501);
assert_eq!(ACCESS_DENIED, 502);
assert_eq!(FEATURE_NOT_SUPPORTED, 503);
}
}