use edi::parse;
#[test]
fn test_empty_document() {
let result = parse("");
assert!(result.is_err());
}
#[test]
fn test_document_with_only_isa() {
let input = "ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>~";
let result = parse(input);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_minimal_valid_document() {
let input = "ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>~
GS*PO*SENDER*RECEIVER*20200301*1253*1*X*004010~
ST*850*0001~
SE*2*0001~
GE*1*1~
IEA*1*000000001~";
let result = parse(input);
assert!(result.is_ok());
let doc = result.unwrap();
assert_eq!(doc.interchanges.len(), 1);
assert_eq!(doc.interchanges[0].functional_groups.len(), 1);
assert_eq!(
doc.interchanges[0].functional_groups[0].transactions.len(),
1
);
}
#[test]
fn test_newline_as_segment_delimiter() {
let input = "ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>
GS*PO*SENDER*RECEIVER*20200301*1253*1*X*004010
ST*850*0001
BEG*00*SA*PO123**20200301
SE*3*0001
GE*1*1
IEA*1*000000001";
let result = parse(input);
assert!(result.is_ok());
let doc = result.unwrap();
assert_eq!(doc.segment_delimiter, '\n');
}
#[test]
fn test_carriage_return_line_feed_delimiter() {
let input = "ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>\r\nGS*PO*SENDER*RECEIVER*20200301*1253*1*X*004010\r\nST*850*0001\r\nBEG*00*SA*PO123**20200301\r\nSE*3*0001\r\nGE*1*1\r\nIEA*1*000000001";
let result = parse(input);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_special_characters_in_data() {
let input = "ISA*00* *00* *ZZ*SENDER-123 *ZZ*RECEIVER.456 *200301*1253*U*00401*000000001*0*T*>~
GS*PO*SENDER-123*RECEIVER.456*20200301*1253*1*X*004010~
ST*850*0001~
BEG*00*SA*PO#123-ABC**20200301~
N1*BT*Company & Sons*9*1223334444~
N3*123 Main St. #456~
N4*NEW YORK*NY*10001~
SE*6*0001~
GE*1*1~
IEA*1*000000001~";
let result = parse(input);
assert!(result.is_ok());
let doc = result.unwrap();
let n1_segment = &doc.interchanges[0].functional_groups[0].transactions[0].segments[1];
assert!(n1_segment.elements[1].contains("Company & Sons"));
}
#[test]
fn test_empty_elements() {
let input = "ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>~
GS*PO*SENDER*RECEIVER*20200301*1253*1*X*004010~
ST*850*0001~
BEG*00*SA***20200301~
REF***~
ITD*****~
SE*5*0001~
GE*1*1~
IEA*1*000000001~";
let result = parse(input);
assert!(result.is_ok());
let doc = result.unwrap();
let beg = &doc.interchanges[0].functional_groups[0].transactions[0].segments[0];
assert_eq!(beg.elements[2], "");
assert_eq!(beg.elements[3], "");
}
#[test]
fn test_very_long_segment() {
let long_data = "X".repeat(1000);
let input = format!(
"ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>~
GS*PO*SENDER*RECEIVER*20200301*1253*1*X*004010~
ST*850*0001~
BEG*00*SA*{}**20200301~
SE*3*0001~
GE*1*1~
IEA*1*000000001~",
long_data
);
let result = parse(&input);
assert!(result.is_ok());
let doc = result.unwrap();
let beg = &doc.interchanges[0].functional_groups[0].transactions[0].segments[0];
assert_eq!(beg.elements[2].len(), 1000);
}
#[test]
fn test_unicode_characters() {
let input = "ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>~
GS*PO*SENDER*RECEIVER*20200301*1253*1*X*004010~
ST*850*0001~
N1*BT*Société Générale*9*1223334444~
N3*Straße 123~
N4*MÜNCHEN*BY*80331~
SE*5*0001~
GE*1*1~
IEA*1*000000001~";
let result = parse(input);
assert!(result.is_ok());
let doc = result.unwrap();
let n1 = &doc.interchanges[0].functional_groups[0].transactions[0].segments[0];
assert!(n1.elements[1].contains("Société"));
}
#[test]
fn test_whitespace_preservation() {
let input = "ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>~
GS*PO*SENDER*RECEIVER*20200301*1253*1*X*004010~
ST*850*0001~
BEG*00*SA* SPACES **20200301~
SE*3*0001~
GE*1*1~
IEA*1*000000001~";
let result = parse(input);
assert!(result.is_ok());
let doc = result.unwrap();
let beg = &doc.interchanges[0].functional_groups[0].transactions[0].segments[0];
assert_eq!(beg.elements[2], "SPACES");
}
#[test]
fn test_multiple_transactions_in_group() {
let input = "ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>~
GS*PO*SENDER*RECEIVER*20200301*1253*1*X*004010~
ST*850*0001~
BEG*00*SA*PO001**20200301~
SE*3*0001~
ST*850*0002~
BEG*00*SA*PO002**20200301~
SE*3*0002~
ST*850*0003~
BEG*00*SA*PO003**20200301~
SE*3*0003~
GE*3*1~
IEA*1*000000001~";
let result = parse(input);
assert!(result.is_ok());
let doc = result.unwrap();
assert_eq!(
doc.interchanges[0].functional_groups[0].transactions.len(),
3
);
let trans1 = &doc.interchanges[0].functional_groups[0].transactions[0];
assert_eq!(trans1.transaction_set_control_number, "0001");
let trans2 = &doc.interchanges[0].functional_groups[0].transactions[1];
assert_eq!(trans2.transaction_set_control_number, "0002");
let trans3 = &doc.interchanges[0].functional_groups[0].transactions[2];
assert_eq!(trans3.transaction_set_control_number, "0003");
}
#[test]
fn test_different_transaction_types() {
let input = "ISA*00* *00* *ZZ*SENDER *ZZ*RECEIVER *200301*1253*U*00401*000000001*0*T*>~
GS*PO*SENDER*RECEIVER*20200301*1253*1*X*004010~
ST*850*0001~
BEG*00*SA*PO123**20200301~
SE*3*0001~
ST*810*0002~
BIG*20200301*INV123*20200301*PO123~
SE*3*0002~
ST*856*0003~
BSN*00*SH123*20200301*1200~
SE*3*0003~
GE*3*1~
IEA*1*000000001~";
let result = parse(input);
assert!(result.is_ok());
let doc = result.unwrap();
let trans = &doc.interchanges[0].functional_groups[0].transactions;
assert_eq!(trans[0].transaction_code, "850");
assert_eq!(trans[0].transaction_name, "Purchase Order");
assert_eq!(trans[1].transaction_code, "810");
assert_eq!(trans[1].transaction_name, "Invoice");
assert_eq!(trans[2].transaction_code, "856");
assert_eq!(trans[2].transaction_name, "Ship Notice/Manifest");
}