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 )