ironwork-exec 0.7.0

ironwork for COBOL: an interpreter over EBCDIC storage
Documentation
use super::*;

#[test]
fn move_corresponding_moves_the_pairs_ibms_rules_allow() {
    let data = [
        "       01  A.\n           05  X PIC 99 VALUE 12.\n           05  Y PIC X(3) VALUE 'ABC'.\n",
        "           05  G.\n               10  Z PIC 9 VALUE 7.\n               10  W PIC 9V9 VALUE 1.5.\n",
        "           05  T PIC 9 OCCURS 2.\n           05  R REDEFINES T PIC XX.\n           05  FILLER PIC X VALUE 'F'.\n",
        "           05  N PIC 9V9 VALUE 2.5.\n           05  P PIC 99 VALUE 42.\n",
        "           05  H.\n               10  H1 PIC X VALUE 'h'.\n               10  H2 PIC X VALUE 'i'.\n",
        "       01  B.\n           05  Y PIC X(3).\n           05  X PIC 99.\n",
        "           05  G.\n               10  W PIC 9V9.\n               10  Z PIC X.\n",
        "           05  T PIC 9 OCCURS 2.\n           05  R PIC XX.\n           05  N PIC X(3).\n           05  P PIC A(2).\n",
        "           05  H PIC X(3).\n",
    ]
    .concat();
    let procedure = [line("MOVE ALL '*' TO B"), line("MOVE CORRESPONDING A TO B"), line("DISPLAY B.")].concat();
    assert_eq!(run(&program("", &data, &procedure)), "ABC12157*********hi \n");
}

#[test]
fn add_and_subtract_corresponding_share_rounded_and_size_error() {
    let data = [
        "       01  S.\n           05  A PIC 9V99 VALUE 1.25.\n           05  B PIC 9 VALUE 9.\n",
        "           05  C PIC X VALUE '5'.\n           05  D PIC 9 VALUE 1.\n",
        "       01  R.\n           05  A PIC 9V9 VALUE 1.0.\n           05  B PIC 9 VALUE 5.\n",
        "           05  C PIC 9 VALUE 1.\n           05  D PIC 9 VALUE 2.\n",
    ]
    .concat();
    let procedure = [
        line("ADD CORR S TO R ROUNDED"),
        line("    ON SIZE ERROR DISPLAY 'SIZE ' R"),
        line("    NOT ON SIZE ERROR DISPLAY 'OK'"),
        line("END-ADD"),
        line("SUBTRACT CORRESPONDING S FROM R"),
        line("DISPLAY R."),
    ]
    .concat();
    assert_eq!(run(&program("", &data, &procedure)), "SIZE 23513\n10412\n");
}

#[test]
fn corresponding_groups_take_their_subscripts_and_qualifiers() {
    let data = [
        "       01  TAB.\n           05  E OCCURS 2.\n               10  K PIC 9.\n               10  V PIC X.\n",
        "       01  ONE.\n           05  K PIC 9 VALUE 4.\n           05  V PIC X VALUE 'Q'.\n",
        "       01  I PIC 9 VALUE 2.\n",
    ]
    .concat();
    let procedure = [line("INITIALIZE TAB"), line("MOVE CORR ONE TO E OF TAB (I)"), line("ADD CORR ONE TO E (1)"), line("DISPLAY TAB.")].concat();
    assert_eq!(run(&program("", &data, &procedure)), "4 4Q\n");
}

#[test]
fn corresponding_names_two_groups() {
    let data = "       01  A.\n           05  X PIC 9.\n           88  X-ON VALUE 1.\n       01  B.\n           05  X PIC 9.\n       01  E PIC 9.\n";
    let errors = compile_errors(&program("", data, &[line("MOVE CORR E TO B"), line("ADD CORR A TO X-ON"), line("MOVE CORR A(1:1) TO B.")].concat()));
    assert!(errors.contains("MOVE CORRESPONDING E: not a group item"), "{errors}");
    assert!(errors.contains("ADD CORRESPONDING X-ON: a condition-name, not a group item"), "{errors}");
    assert!(errors.contains("MOVE CORRESPONDING A: reference-modified"), "{errors}");
}