Data-Sah-JS

 view release on metacpan or  search on metacpan

lib/Test/Data/Sah/JS.pm  view on Meta::CPAN

package Test::Data::Sah::JS;

our $DATE = '2016-09-14'; # DATE
our $VERSION = '0.87'; # VERSION

use 5.010001;
use strict;
use warnings;

use Test::Data::Sah qw(run_spectest all_match);
use Test::More 0.98;

use Capture::Tiny qw(tee_merged);
use Data::Sah qw(gen_validator);
use File::Temp qw(tempdir tempfile);
use Nodejs::Util qw(get_nodejs_path);
use String::Indent qw(indent);

use Exporter qw(import);
our @EXPORT_OK = qw(run_spectest_for_js);

sub _encode_json {
    state $json = do {
        require JSON::MaybeXS;
        JSON::MaybeXS->new->allow_nonref;
    };
    $json->encode(@_);
}

sub run_spectest_for_js {
    my %args = @_;

    run_spectest(
        tests_func => sub {
            my ($tests, $opts) = @_;

            # we compile all the schemas (plus some control code) to a single js
            # file then execute it using nodejs. the js file is supposed to
            # produce TAP output.

            my $node_path = $opts->{node_path} // $args{nodejs_path} //
                get_nodejs_path();
            my $sah = Data::Sah->new;
            my $js = $sah->get_compiler('js');

            my %names; # key: json(schema)
            my %counters; # key: type name

            my @js_code;

            # controller/tap code
            push @js_code, <<'_';
String.prototype.repeat = function(n) { return new Array(isNaN(n) ? 1 : ++n).join(this) }

// BEGIN TAP

var indent = "    "
var tap_indent_level = 2
var tap_counter = 0
var tap_num_nok = 0

function tap_esc(name) {
    return name.replace(/#/g, '\\#').replace(/\n/g, '\n' + indent.repeat(tap_indent_level+1) + '#')
}

function tap_print_oknok(is_ok, name) {
    if (!is_ok) tap_num_nok++
    console.log(
        indent.repeat(tap_indent_level) +
        (is_ok ? "ok " : "not ok ") +
        ++tap_counter +
        (name ? " - " + tap_esc(name) : "")
    )
}

function tap_print_summary() {
    if (tap_num_nok > 0) {
        console.log(indent.repeat(tap_indent_level) + '# ' + tap_num_nok + ' failed test(s)')
    }
    console.log(
        indent.repeat(tap_indent_level) + "1.." + tap_counter
    )
}

function ok(cond, name) {
    tap_print_oknok(cond, name)
}

function subtest(name, code) {
     var save_counter = tap_counter
     var save_num_nok = tap_num_nok

     tap_num_nok = 0
     tap_counter = 0
     tap_indent_level++
     code()
     tap_print_summary()
     tap_indent_level--

     tap_counter       = save_counter
     var save2_num_nok = tap_num_nok
     tap_num_nok = save_num_nok
     tap_print_oknok(save2_num_nok == 0, name)
}

function done_testing() {
    tap_print_summary()
}

// END TAP

var res;



( run in 0.568 second using v1.01-cache-2.11-cpan-39bf76dae61 )