/*------------------------------------------------------------------------------------------------------
 This program tests the hypothesis that format adjustments applied during date formatting are identical
 to those applied in date format declarations and date format assignments in OpenEdge ABL for each
 possible SESSION:DATE-FORMAT setting.

 To achieve this, it formats a fixed date value using each of the 576 possible date format permutations
 (covering all combinations of "9", "99", "999", and "9999" with separators ".", "-", and "/") in two
 ways under the same SESSION:DATE-FORMAT setting:
 
 1. first, with the format as assigned to a variable, and
 2. second, with the format as adjusted for assignment.

 The resulting strings are written to a file to be compared for equality by extra tools.
 If all comparisons match, the format adjustment processes are likely equivalent. If any comparison
 fails, the proposition is disproven.
------------------------------------------------------------------------------------------------------*/

/* Constants for components and separators */
DEFINE VARIABLE vNines AS CHARACTER EXTENT 4 INITIAL ["9", "99", "999", "9999"] NO-UNDO.
DEFINE VARIABLE vSeparators AS CHARACTER EXTENT 3 INITIAL [".", "-", "/"] NO-UNDO.
DEFINE VARIABLE vSessionFormats AS CHARACTER EXTENT 6 INITIAL ["mdy", "dmy", "ymd", "myd", "dym", "ydm"] NO-UNDO.
DEFINE VARIABLE vFixedDate AS DATE INITIAL 1/2/3 NO-UNDO. /* Fixed test date */

/* Variables for iteration */
DEFINE VARIABLE vFirst AS INTEGER NO-UNDO.
DEFINE VARIABLE vSecond AS INTEGER NO-UNDO.
DEFINE VARIABLE vThird AS INTEGER NO-UNDO.
DEFINE VARIABLE vSep1 AS INTEGER NO-UNDO.
DEFINE VARIABLE vSep2 AS INTEGER NO-UNDO.
DEFINE VARIABLE vSession AS INTEGER NO-UNDO.
DEFINE VARIABLE vFormat AS CHARACTER NO-UNDO.
DEFINE VARIABLE vAssignedString AS CHARACTER NO-UNDO.
DEFINE VARIABLE vAdjustedString AS CHARACTER NO-UNDO.
DEFINE VARIABLE vMismatches AS INTEGER NO-UNDO.

DEFINE FRAME myFrame
   vFixedDate
   WITH NO-LABELS NO-BOX DOWN SIZE 62 BY 10.

DO vSession = 1 TO 6:
    DEFINE VARIABLE order AS CHARACTER NO-UNDO.
    order = vSessionFormats[vSession].

    OUTPUT TO VALUE( "date_format_formatting_adjusted_" + order + ".i" ).

    SESSION:DATE-FORMAT = order.
    
    DO vFirst = 1 TO 4:
        DO vSecond = 1 TO 4:
            DO vThird = 1 TO 4:
                DO vSep1 = 1 TO 3:
                    DO vSep2 = 1 TO 3:
                        DO WITH FRAME myFrame:
                            /* Generate format permutation */
                            vFormat = vNines[vFirst] + vSeparators[vSep1] +
                                      vNines[vSecond] + vSeparators[vSep2] +
                                      vNines[vThird].
                            vFixedDate:FORMAT = vFormat.
                            DEFINE VARIABLE asString AS CHARACTER NO-UNDO.
                            asString = STRING(1/2/3, vFormat) NO-ERROR.
                            IF NOT ERROR-STATUS:ERROR THEN 
                                DISPLAY /*vFormat NO-LABELS*/ vFixedDate NO-LABELS "" asString NO-LABELS FORMAT "X(30)" NO-ERROR.
                        END.
                    END.
                END.
            END.
        END.
    END.
    OUTPUT CLOSE.
END.
