BATsh

 view release on metacpan or  search on metacpan

t/0003-cmd-interpreter.t  view on Meta::CPAN

        $BATsh::Env::STORE{'CMD_T2'} = 'world';
        my $out = _capture(sub { BATsh->run_string('ECHO %CMD_T2%') });
        _ok($out =~ /world/, 'CMD2: ECHO expands %VAR%');
    },

    # CMD3: IF condition true
    sub {
        delete $BATsh::Env::STORE{'CMD_T3'};
        BATsh->run_string(join("\n",
            'SET CMD_T3=before',
            'IF "1"=="1" SET CMD_T3=if_true',
        ));
        _ok(( defined( $BATsh::Env::STORE{'CMD_T3'} ) ? $BATsh::Env::STORE{'CMD_T3'} : '' ) eq 'if_true',
            'CMD3: IF condition true');
    },

    # CMD4: IF condition false
    sub {
        delete $BATsh::Env::STORE{'CMD_T4'};
        BATsh->run_string(join("\n",
            'SET CMD_T4=before',
            'IF "1"=="2" SET CMD_T4=should_not_set',
        ));
        _ok(( defined( $BATsh::Env::STORE{'CMD_T4'} ) ? $BATsh::Env::STORE{'CMD_T4'} : '' ) eq 'before',
            'CMD4: IF condition false');
    },

    # CMD5: IF ... ( ... ) ELSE ( ... ) multiline
    sub {
        delete $BATsh::Env::STORE{'CMD_T5'};
        BATsh->run_string(join("\n",
            'IF "x"=="y" (',
            '    SET CMD_T5=wrong',
            ') ELSE (',
            '    SET CMD_T5=else_ok',
            ')',
        ));
        _ok(( defined( $BATsh::Env::STORE{'CMD_T5'} ) ? $BATsh::Env::STORE{'CMD_T5'} : '' ) eq 'else_ok',
            'CMD5: IF/ELSE multiline block');
    },

    # CMD6: FOR %%V IN (list) DO
    sub {
        delete $BATsh::Env::STORE{'CMD_T6'};
        BATsh->run_string(join("\n",
            'SET CMD_T6=',
            'FOR %%I IN (A B C) DO SET CMD_T6=%CMD_T6%%%I',
        ));
        _ok(( defined( $BATsh::Env::STORE{'CMD_T6'} ) ? $BATsh::Env::STORE{'CMD_T6'} : '' ) eq 'ABC',
            'CMD6: FOR %%V IN (list) DO accumulates');
    },

    # CMD7: FOR /L %%N IN (1,1,5) DO
    sub {
        delete $BATsh::Env::STORE{'CMD_T7'};
        BATsh->run_string(join("\n",
            'SET CMD_T7=0',
            'FOR /L %%N IN (1,1,5) DO SET /A CMD_T7=%CMD_T7%+1',
        ));
        _ok(( defined( $BATsh::Env::STORE{'CMD_T7'} ) ? $BATsh::Env::STORE{'CMD_T7'} : '' ) eq '5',
            'CMD7: FOR /L counts 5 iterations');
    },

    # CMD8: SET /A arithmetic
    sub {
        delete $BATsh::Env::STORE{'CMD_T8'};
        BATsh->run_string("SET /A CMD_T8=6*7");
        _ok(( defined( $BATsh::Env::STORE{'CMD_T8'} ) ? $BATsh::Env::STORE{'CMD_T8'} : '' ) eq '42',
            'CMD8: SET /A 6*7 = 42');
    },

    # CMD9: GOTO skips lines until label
    sub {
        delete $BATsh::Env::STORE{'CMD_T9'};
        BATsh->run_string(join("\n",
            'SET CMD_T9=before',
            'GOTO :SKIP9',
            'SET CMD_T9=should_skip',
            ':SKIP9',
            'SET CMD_T9=%CMD_T9%_after',
        ));
        _ok(( defined( $BATsh::Env::STORE{'CMD_T9'} ) ? $BATsh::Env::STORE{'CMD_T9'} : '' ) eq 'before_after',
            'CMD9: GOTO skips to label');
    },

    # CMD10: SETLOCAL / ENDLOCAL restores scope
    sub {
        $BATsh::Env::STORE{'CMD_T10'} = 'outer';
        BATsh->run_string(join("\n",
            'SETLOCAL',
            'SET CMD_T10=inner',
            'ENDLOCAL',
        ));
        _ok(( defined( $BATsh::Env::STORE{'CMD_T10'} ) ? $BATsh::Env::STORE{'CMD_T10'} : '' ) eq 'outer',
            'CMD10: SETLOCAL/ENDLOCAL restores variable');
    },

    # CMD11: IF DEFINED
    sub {
        $BATsh::Env::STORE{'CMD_T11_DEFINED'} = 'yes';
        delete $BATsh::Env::STORE{'CMD_T11_RESULT'};
        BATsh->run_string(join("\n",
            'IF DEFINED CMD_T11_DEFINED SET CMD_T11_RESULT=defined_ok',
        ));
        _ok(( defined( $BATsh::Env::STORE{'CMD_T11_RESULT'} ) ? $BATsh::Env::STORE{'CMD_T11_RESULT'} : '' ) eq 'defined_ok',
            'CMD11: IF DEFINED');
    },

    # CMD12: IF NOT
    sub {
        delete $BATsh::Env::STORE{'CMD_T12'};
        BATsh->run_string(join("\n",
            'IF NOT "a"=="b" SET CMD_T12=not_ok',
        ));
        _ok(( defined( $BATsh::Env::STORE{'CMD_T12'} ) ? $BATsh::Env::STORE{'CMD_T12'} : '' ) eq 'not_ok',
            'CMD12: IF NOT condition');
    },

    # CMD13: SETLOCAL nested
    # CMD_T13_L1 is set BETWEEN the two ENDLOCALs.
    # The outer SETLOCAL was taken before CMD_T13_L1 existed, so ENDLOCAL



( run in 1.175 second using v1.01-cache-2.11-cpan-71847e10f99 )