summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIngy döt Net <ingy@ingy.net>2016-12-29 20:14:14 -0600
committerIngy döt Net <ingy@ingy.net>2016-12-30 11:09:58 -0600
commitbd32043b857f265c7d233b218f2e8afcd1ceecf1 (patch)
tree991bd15357db04595e08bd2e7ec8721ee473b99f
downloadlibyaml-git-bd32043b857f265c7d233b218f2e8afcd1ceecf1.tar.gz
Include libyaml-test and libyaml-parser-emitter
Before the `make test-suite` command would clone yaml/libyaml-test which would in tuen clone yaml/libyaml-parser-emitter. Now they are part of the repository since they are not really useful outside the repository. They still clone the data branch of yaml/yaml-test-suite. That is where all the actual test data resides. That belongs outside the repo because it is intended for all yaml frameworks.
-rw-r--r--Makefile29
-rw-r--r--ReadMe.md17
-rw-r--r--src/Makefile54
-rw-r--r--src/ReadMe.md34
-rw-r--r--src/libyaml-emitter.c232
-rw-r--r--src/libyaml-parser.c144
-rw-r--r--src/test/example-2.27-invoice.events59
-rw-r--r--src/test/example-2.27-invoice.out26
-rw-r--r--src/test/example-2.27-invoice.yaml29
-rw-r--r--src/test/libyaml-emitter.t26
-rw-r--r--src/test/libyaml-parser.t26
-rw-r--r--test/libyaml-emitter.skip31
-rwxr-xr-xtest/libyaml-emitter.t43
-rw-r--r--test/libyaml-parser.skip22
-rwxr-xr-xtest/libyaml-parser.t36
15 files changed, 808 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..bdf89f6
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,29 @@
+.PHONY: test
+GITHUB_ORG_URI := https://github.com/yaml
+TEST_SUITE_URL := $(GITHUB_ORG_URI)/yaml-test-suite
+LIBYAML_DIR ?= $(PWD)/libyaml-parser-emitter/libyaml
+
+default: help
+
+help:
+ @echo 'test - Run the tests'
+ @echo 'clean - Remove generated files'
+ @echo 'help - Show help'
+
+# Depends on parser and emitter but, building parser will also build emitter.
+# Building twice makes things fail. Note: Some environments like on OS X, the
+# shell resets the {DY,}LD_LIBRARY_PATH vars, so we work around it like so:
+test: data src/libyaml-parser
+ (export MY_LD_LIBRARY_PATH=$(LIBYAML_DIR)/src/.libs; prove -lv test)
+
+clean:
+ rm -fr data
+
+data:
+ git clone $(TEST_SUITE_URL) $@ --branch=$@
+
+%/libyaml-parser %/libyaml-emitter: %
+ (cd $<; make build)
+
+libyaml-parser-emitter:
+ git clone $(GITHUB_ORG_URI)/$@ $@
diff --git a/ReadMe.md b/ReadMe.md
new file mode 100644
index 0000000..c1ef208
--- /dev/null
+++ b/ReadMe.md
@@ -0,0 +1,17 @@
+LibYAML Test Runner
+===================
+
+Run libyaml-parser and libyaml-emitter against yaml-test-suite
+
+# Synopsis
+
+```
+make test
+```
+
+# Overview
+
+See:
+
+* https://github.com/yaml/libyaml
+* https://github.com/yaml/yaml-test-suite
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..de0d49a
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,54 @@
+LIBYAML_DIR ?= libyaml
+LIBYAML_REPO ?= https://github.com/yaml/libyaml
+LIBYAML_BRANCH ?= master
+define HELP
+This Makefile supports the following targets:
+
+ build - Build ./libyaml-parser and ./libyaml-emitter
+ test - Run tests
+
+endef
+export HELP
+
+help:
+ @echo "$$HELP"
+
+build: touch libyaml-parser libyaml-emitter
+
+touch:
+ifneq ($(LIBYAML_DIR),libyaml)
+ touch *.c
+endif
+
+libyaml-%: $(LIBYAML_DIR)/tests/.libs/run-%
+ cp $< $@
+
+$(LIBYAML_DIR)/tests/.libs/%: $(LIBYAML_DIR)/tests/%.c $(LIBYAML_DIR)/Makefile
+ make -C $(LIBYAML_DIR)
+ifneq ($(LIBYAML_DIR),libyaml)
+ (cd $(LIBYAML_DIR) && git checkout tests/run-parser.c tests/run-emitter.c)
+endif
+
+$(LIBYAML_DIR)/tests/run-%: libyaml-% $(LIBYAML_DIR)
+ cp $< $@
+.SECONDARY: \
+ $(LIBYAML_DIR)/tests/run-parser.c \
+ $(LIBYAML_DIR)/tests/run-emitter.c \
+ $(LIBYAML_DIR)/tests/.libs/run-parser \
+ $(LIBYAML_DIR)/tests/.libs/run-emitter
+
+$(LIBYAML_DIR)/Makefile: $(LIBYAML_DIR)
+ ( cd $< && ./bootstrap && ./configure )
+ touch $@
+
+$(LIBYAML_DIR):
+ git clone $(LIBYAML_REPO) $@
+ sleep 1
+ touch *.c
+
+.PHONY: test
+test: build
+ prove -lv test/
+
+clean:
+ rm -fr libyaml libyaml-parser libyaml-emitter
diff --git a/src/ReadMe.md b/src/ReadMe.md
new file mode 100644
index 0000000..ced29cb
--- /dev/null
+++ b/src/ReadMe.md
@@ -0,0 +1,34 @@
+libyaml-parser-emitter
+======================
+
+Parser and Emitter CLI tools for libyaml
+
+# Synopsis
+
+```
+make build
+make test
+```
+
+# Usage
+
+Print parse events for a YAML file (or stdin):
+```
+./libyaml-parser file.yaml
+./libyaml-parser < file.yaml
+cat file.yaml | ./libyaml-parser
+```
+
+Print the YAML for a libyaml-parser events file (or stdin):
+```
+./libyaml-emitter file.events
+./libyaml-emitter < file.events
+cat file.events | ./libyaml-emitter
+```
+
+# Build
+
+```
+export LIBYAML_DIR=/path/to/libyaml # Optional
+make build
+```
diff --git a/src/libyaml-emitter.c b/src/libyaml-emitter.c
new file mode 100644
index 0000000..6c599e8
--- /dev/null
+++ b/src/libyaml-emitter.c
@@ -0,0 +1,232 @@
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <assert.h>
+
+bool get_line(FILE * input, char *line);
+char *get_anchor(char sigil, char *line, char *anchor);
+char *get_tag(char *line, char *tag);
+void get_value(char *line, char *value, int *style);
+
+int main(int argc, char *argv[])
+{
+ FILE *input;
+ yaml_emitter_t emitter;
+ yaml_event_t event;
+
+ int canonical = 0;
+ int unicode = 0;
+ char line[1024];
+
+ if (argc == 1)
+ input = stdin;
+ else if (argc == 2)
+ input = fopen(argv[1], "rb");
+ else {
+ fprintf(stderr, "Usage: libyaml-emitter [<input-file>]\n");
+ return 1;
+ }
+ assert(input);
+
+ if (!yaml_emitter_initialize(&emitter)) {
+ fprintf(stderr, "Could not initalize the emitter object\n");
+ return 1;
+ }
+ yaml_emitter_set_output_file(&emitter, stdout);
+ yaml_emitter_set_canonical(&emitter, canonical);
+ yaml_emitter_set_unicode(&emitter, unicode);
+
+ while (get_line(input, line)) {
+ int ok;
+ char anchor[256];
+ char tag[256];
+ int implicit;
+
+ if (strncmp(line, "+STR", 4) == 0) {
+ ok = yaml_stream_start_event_initialize(&event, YAML_UTF8_ENCODING);
+ }
+ else if (strncmp(line, "-STR", 4) == 0) {
+ ok = yaml_stream_end_event_initialize(&event);
+ }
+ else if (strncmp(line, "+DOC", 4) == 0) {
+ implicit = strncmp(line, "+DOC ---", 8) != 0;
+ ok = yaml_document_start_event_initialize(&event, NULL, NULL, NULL, implicit);
+ }
+ else if (strncmp(line, "-DOC", 4) == 0) {
+ implicit = strncmp(line, "-DOC ...", 8) != 0;
+ ok = yaml_document_end_event_initialize(&event, implicit);
+ }
+ else if (strncmp(line, "+MAP", 4) == 0) {
+ ok = yaml_mapping_start_event_initialize(&event, (yaml_char_t *)
+ get_anchor('&', line, anchor), (yaml_char_t *)
+ get_tag(line, tag), 0, YAML_BLOCK_MAPPING_STYLE);
+ }
+ else if (strncmp(line, "-MAP", 4) == 0) {
+ ok = yaml_mapping_end_event_initialize(&event);
+ }
+ else if (strncmp(line, "+SEQ", 4) == 0) {
+ ok = yaml_sequence_start_event_initialize(&event, (yaml_char_t *)
+ get_anchor('&', line, anchor), (yaml_char_t *)
+ get_tag(line, tag), 0, YAML_BLOCK_SEQUENCE_STYLE);
+ }
+ else if (strncmp(line, "-SEQ", 4) == 0) {
+ ok = yaml_sequence_end_event_initialize(&event);
+ }
+ else if (strncmp(line, "=VAL", 4) == 0) {
+ char value[1024];
+ int style;
+
+ get_value(line, value, &style);
+ implicit = (get_tag(line, tag) == NULL);
+
+ ok = yaml_scalar_event_initialize(&event, (yaml_char_t *)
+ get_anchor('&', line, anchor), (yaml_char_t *) get_tag(line, tag), (yaml_char_t *) value, -1, implicit, implicit, style);
+ }
+ else if (strncmp(line, "=ALI", 4) == 0) {
+ ok = yaml_alias_event_initialize(&event, (yaml_char_t *)
+ get_anchor('*', line, anchor)
+ );
+ }
+ else {
+ fprintf(stderr, "Unknown event: '%s'\n", line);
+ fflush(stdout);
+ return 1;
+ }
+
+ if (!ok)
+ goto event_error;
+ if (!yaml_emitter_emit(&emitter, &event))
+ goto emitter_error;
+ }
+
+ assert(!fclose(input));
+ yaml_emitter_delete(&emitter);
+ fflush(stdout);
+
+ return 0;
+
+ emitter_error:
+ switch (emitter.error) {
+ case YAML_MEMORY_ERROR:
+ fprintf(stderr, "Memory error: Not enough memory for emitting\n");
+ break;
+ case YAML_WRITER_ERROR:
+ fprintf(stderr, "Writer error: %s\n", emitter.problem);
+ break;
+ case YAML_EMITTER_ERROR:
+ fprintf(stderr, "Emitter error: %s\n", emitter.problem);
+ break;
+ default:
+ /*
+ * Couldn't happen.
+ */
+ fprintf(stderr, "Internal error\n");
+ break;
+ }
+ yaml_emitter_delete(&emitter);
+ return 1;
+
+ event_error:
+ fprintf(stderr, "Memory error: Not enough memory for creating an event\n");
+ yaml_emitter_delete(&emitter);
+ return 1;
+}
+
+bool get_line(FILE * input, char *line)
+{
+ char *newline;
+
+ if (!fgets(line, 1024 - 1, input))
+ return false;
+
+ if ((newline = strchr(line, '\n')) == NULL) {
+ fprintf(stderr, "Line too long: '%s'", line);
+ abort();
+ }
+ *newline = '\0';
+
+ return true;
+}
+
+char *get_anchor(char sigil, char *line, char *anchor)
+{
+ char *start;
+ char *end;
+ if ((start = strchr(line, sigil)) == NULL)
+ return NULL;
+ start++;
+ if ((end = strchr(start, ' ')) == NULL)
+ end = line + strlen(line);
+ memcpy(anchor, start, end - start);
+ anchor[end - start] = '\0';
+ return anchor;
+}
+
+char *get_tag(char *line, char *tag)
+{
+ char *start;
+ char *end;
+ if ((start = strchr(line, '<')) == NULL)
+ return NULL;
+ if ((end = strchr(line, '>')) == NULL)
+ return NULL;
+ memcpy(tag, start + 1, end - start - 1);
+ tag[end - start - 1] = '\0';
+ return tag;
+}
+
+void get_value(char *line, char *value, int *style)
+{
+ int i = 0;
+ char *c;
+ char *start = NULL;
+ char *end = line + strlen(line);
+
+ for (c = line + 4; c < end; c++) {
+ if (*c == ' ') {
+ start = c + 1;
+ if (*start == ':')
+ *style = YAML_PLAIN_SCALAR_STYLE;
+ else if (*start == '\'')
+ *style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
+ else if (*start == '"')
+ *style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
+ else if (*start == '|')
+ *style = YAML_LITERAL_SCALAR_STYLE;
+ else if (*start == '>')
+ *style = YAML_FOLDED_SCALAR_STYLE;
+ else {
+ start = NULL;
+ continue;
+ }
+ start++;
+ break;
+ }
+ }
+ if (!start)
+ abort();
+
+ for (c = start; c < end; c++) {
+ if (*c == '\\') {
+ if (*++c == '\\')
+ value[i++] = '\\';
+ else if (*c == '0')
+ value[i++] = '\0';
+ else if (*c == 'b')
+ value[i++] = '\b';
+ else if (*c == 'n')
+ value[i++] = '\n';
+ else if (*c == 'r')
+ value[i++] = '\r';
+ else if (*c == 't')
+ value[i++] = '\t';
+ else
+ abort();
+ }
+ else
+ value[i++] = *c;
+ }
+ value[i] = '\0';
+}
diff --git a/src/libyaml-parser.c b/src/libyaml-parser.c
new file mode 100644
index 0000000..b2c7f84
--- /dev/null
+++ b/src/libyaml-parser.c
@@ -0,0 +1,144 @@
+#include <yaml.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+void print_escaped(yaml_char_t * str, size_t length);
+
+int main(int argc, char *argv[])
+{
+ FILE *input;
+ yaml_parser_t parser;
+ yaml_event_t event;
+
+ if (argc == 1)
+ input = stdin;
+ else if (argc == 2)
+ input = fopen(argv[1], "rb");
+ else {
+ fprintf(stderr, "Usage: libyaml-parser [<input-file>]\n");
+ return 1;
+ }
+ assert(input);
+
+ if (!yaml_parser_initialize(&parser)) {
+ fprintf(stderr, "Could not initialize the parser object\n");
+ return 1;
+ }
+ yaml_parser_set_input_file(&parser, input);
+
+ while (1) {
+ yaml_event_type_t type;
+ if (!yaml_parser_parse(&parser, &event)) {
+ fprintf(stderr, "Parse error: %s\n", parser.problem);
+ return 1;
+ }
+ type = event.type;
+
+ if (type == YAML_NO_EVENT)
+ printf("???\n");
+ else if (type == YAML_STREAM_START_EVENT)
+ printf("+STR\n");
+ else if (type == YAML_STREAM_END_EVENT)
+ printf("-STR\n");
+ else if (type == YAML_DOCUMENT_START_EVENT) {
+ printf("+DOC");
+ if (!event.data.document_start.implicit)
+ printf(" ---");
+ printf("\n");
+ }
+ else if (type == YAML_DOCUMENT_END_EVENT) {
+ printf("-DOC");
+ if (!event.data.document_end.implicit)
+ printf(" ...");
+ printf("\n");
+ }
+ else if (type == YAML_MAPPING_START_EVENT) {
+ printf("+MAP");
+ if (event.data.mapping_start.anchor)
+ printf(" &%s", event.data.mapping_start.anchor);
+ if (event.data.mapping_start.tag)
+ printf(" <%s>", event.data.mapping_start.tag);
+ printf("\n");
+ }
+ else if (type == YAML_MAPPING_END_EVENT)
+ printf("-MAP\n");
+ else if (type == YAML_SEQUENCE_START_EVENT) {
+ printf("+SEQ");
+ if (event.data.sequence_start.anchor)
+ printf(" &%s", event.data.sequence_start.anchor);
+ if (event.data.sequence_start.tag)
+ printf(" <%s>", event.data.sequence_start.tag);
+ printf("\n");
+ }
+ else if (type == YAML_SEQUENCE_END_EVENT)
+ printf("-SEQ\n");
+ else if (type == YAML_SCALAR_EVENT) {
+ printf("=VAL");
+ if (event.data.scalar.anchor)
+ printf(" &%s", event.data.scalar.anchor);
+ if (event.data.scalar.tag)
+ printf(" <%s>", event.data.scalar.tag);
+ switch (event.data.scalar.style) {
+ case YAML_PLAIN_SCALAR_STYLE:
+ printf(" :");
+ break;
+ case YAML_SINGLE_QUOTED_SCALAR_STYLE:
+ printf(" '");
+ break;
+ case YAML_DOUBLE_QUOTED_SCALAR_STYLE:
+ printf(" \"");
+ break;
+ case YAML_LITERAL_SCALAR_STYLE:
+ printf(" |");
+ break;
+ case YAML_FOLDED_SCALAR_STYLE:
+ printf(" >");
+ break;
+ case YAML_ANY_SCALAR_STYLE:
+ abort();
+ }
+ print_escaped(event.data.scalar.value, event.data.scalar.length);
+ printf("\n");
+ }
+ else if (type == YAML_ALIAS_EVENT)
+ printf("=ALI *%s\n", event.data.alias.anchor);
+ else
+ abort();
+
+ yaml_event_delete(&event);
+
+ if (type == YAML_STREAM_END_EVENT)
+ break;
+ }
+
+ assert(!fclose(input));
+ yaml_parser_delete(&parser);
+ fflush(stdout);
+
+ return 0;
+}
+
+void print_escaped(yaml_char_t * str, size_t length)
+{
+ int i;
+ char c;
+
+ for (i = 0; i < length; i++) {
+ c = *(str + i);
+ if (c == '\\')
+ printf("\\\\");
+ else if (c == '\0')
+ printf("\\0");
+ else if (c == '\b')
+ printf("\\b");
+ else if (c == '\n')
+ printf("\\n");
+ else if (c == '\r')
+ printf("\\r");
+ else if (c == '\t')
+ printf("\\t");
+ else
+ printf("%c", c);
+ }
+}
diff --git a/src/test/example-2.27-invoice.events b/src/test/example-2.27-invoice.events
new file mode 100644
index 0000000..fdd1b5f
--- /dev/null
+++ b/src/test/example-2.27-invoice.events
@@ -0,0 +1,59 @@
++STR
++DOC ---
++MAP <tag:clarkevans.com,2002:invoice>
+=VAL :invoice
+=VAL :34843
+=VAL :date
+=VAL :2001-01-23
+=VAL :bill-to
++MAP &id001
+=VAL :given
+=VAL :Chris
+=VAL :family
+=VAL :Dumars
+=VAL :address
++MAP
+=VAL :lines
+=VAL |458 Walkman Dr.\nSuite #292\n
+=VAL :city
+=VAL :Royal Oak
+=VAL :state
+=VAL :MI
+=VAL :postal
+=VAL :48046
+-MAP
+-MAP
+=VAL :ship-to
+=ALI *id001
+=VAL :product
++SEQ
++MAP
+=VAL :sku
+=VAL :BL394D
+=VAL :quantity
+=VAL :4
+=VAL :description
+=VAL :Basketball
+=VAL :price
+=VAL :450.00
+-MAP
++MAP
+=VAL :sku
+=VAL :BL4438H
+=VAL :quantity
+=VAL :1
+=VAL :description
+=VAL :Super Hoop
+=VAL :price
+=VAL :2392.00
+-MAP
+-SEQ
+=VAL :tax
+=VAL :251.42
+=VAL :total
+=VAL :4443.52
+=VAL :comments
+=VAL :Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
+-MAP
+-DOC
+-STR
diff --git a/src/test/example-2.27-invoice.out b/src/test/example-2.27-invoice.out
new file mode 100644
index 0000000..1a876c9
--- /dev/null
+++ b/src/test/example-2.27-invoice.out
@@ -0,0 +1,26 @@
+--- !<tag:clarkevans.com,2002:invoice>
+invoice: 34843
+date: 2001-01-23
+bill-to: &id001
+ given: Chris
+ family: Dumars
+ address:
+ lines: |
+ 458 Walkman Dr.
+ Suite #292
+ city: Royal Oak
+ state: MI
+ postal: 48046
+ship-to: *id001
+product:
+- sku: BL394D
+ quantity: 4
+ description: Basketball
+ price: 450.00
+- sku: BL4438H
+ quantity: 1
+ description: Super Hoop
+ price: 2392.00
+tax: 251.42
+total: 4443.52
+comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
diff --git a/src/test/example-2.27-invoice.yaml b/src/test/example-2.27-invoice.yaml
new file mode 100644
index 0000000..4625739
--- /dev/null
+++ b/src/test/example-2.27-invoice.yaml
@@ -0,0 +1,29 @@
+--- !<tag:clarkevans.com,2002:invoice>
+invoice: 34843
+date : 2001-01-23
+bill-to: &id001
+ given : Chris
+ family : Dumars
+ address:
+ lines: |
+ 458 Walkman Dr.
+ Suite #292
+ city : Royal Oak
+ state : MI
+ postal : 48046
+ship-to: *id001
+product:
+ - sku : BL394D
+ quantity : 4
+ description : Basketball
+ price : 450.00
+ - sku : BL4438H
+ quantity : 1
+ description : Super Hoop
+ price : 2392.00
+tax : 251.42
+total: 4443.52
+comments:
+ Late afternoon is best.
+ Backup contact is Nancy
+ Billsmer @ 338-4338.
diff --git a/src/test/libyaml-emitter.t b/src/test/libyaml-emitter.t
new file mode 100644
index 0000000..7afd5f0
--- /dev/null
+++ b/src/test/libyaml-emitter.t
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+got=$(mktemp)
+
+count=0
+for test in test/*.events; do
+ want=${test//.events/.out}
+ label="Emitting '$test' equals '$want'"
+ rc=0
+ ./libyaml-emitter $test > $got || rc=$?
+ if [[ $rc -ne 0 ]]; then
+ echo "not ok $((++count)) - Error code $rc"
+ continue
+ fi
+ rc=0
+ diff=$(diff -u $want $got) || rc=$?
+ if [[ $rc -eq 0 ]]; then
+ echo "ok $((++count)) - $label"
+ else
+ echo "not ok $((++count)) - $label"
+ diff=${diff//$'\n'/$'\n'# }
+ echo "# $diff"
+ fi
+done
+
+echo "1..$count"
diff --git a/src/test/libyaml-parser.t b/src/test/libyaml-parser.t
new file mode 100644
index 0000000..40c56da
--- /dev/null
+++ b/src/test/libyaml-parser.t
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+got=$(mktemp)
+
+count=0
+for test in test/*.yaml; do
+ want=${test//.yaml/.events}
+ label="Parsing '$test' equals '$want'"
+ rc=0
+ ./libyaml-parser $test > $got || rc=$?
+ if [[ $rc -ne 0 ]]; then
+ echo "not ok $((++count)) - Error code $rc"
+ continue
+ fi
+ rc=0
+ diff=$(diff -u $want $got) || rc=$?
+ if [[ $rc -eq 0 ]]; then
+ echo "ok $((++count)) - $label"
+ else
+ echo "not ok $((++count)) - $label"
+ diff=${diff//$'\n'/$'\n'# }
+ echo "# $diff"
+ fi
+done
+
+echo "1..$count"
diff --git a/test/libyaml-emitter.skip b/test/libyaml-emitter.skip
new file mode 100644
index 0000000..7ceb1ce
--- /dev/null
+++ b/test/libyaml-emitter.skip
@@ -0,0 +1,31 @@
+27NA # %YAML 1.2
+2JQS # Null key emission not supported in libyaml
+2SXE # Colon in anchor
+2XXW # Emits space after colon for null mapping value
+35KP # Not adding tags to multiple docs
+4ABK # Null key
+5TYM # No libyaml-emitter %TAG support yet
+5WE3 # Emits space after colon for null mapping value
+6BCT # Tab after dash in sequence. XXX?
+6CK3 # No libyaml-emitter %TAG support yet
+6LVF # Unknown directive
+6M2F # Null key
+6ZKB # %YAML 1.2
+7W2P # Emits space after colon for null mapping value
+8KHE # Emits space after colon for null mapping value
+8MK2 # Emits '!<%21> a' for '! a'
+C2DT # Emits space after colon for null mapping value
+DFF7 # Null key
+FH7J # Null key && Emits space after colon for null mapping value
+FRK4 # Null key
+JTV5 # Emits space after colon for null mapping value
+KZN9 # Null key
+LE5A # Emits space after colon for null mapping value
+NHX8 # Null key
+PW8X # Null key && Emits space after colon for null mapping value
+S3PD # Null key
+S4JQ # Emits '!<%21> a' for '! a'
+UT92 # Emits space after --- for null document
+W42U # Emits space after - for null sequence entry
+W4TN # Emits space after --- for null document
+WZ62 # Null key value
diff --git a/test/libyaml-emitter.t b/test/libyaml-emitter.t
new file mode 100755
index 0000000..fb8a634
--- /dev/null
+++ b/test/libyaml-emitter.t
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [[ $# -gt 0 ]]; then
+ ids=("$@")
+else
+ ids=(`find data | grep '/===$' | cut -d/ -f2 | sort`)
+fi
+
+# Some environments like on OS X, the shell resets the following vars, so we
+# work around it like so:
+export LD_LIBRARY_PATH="${MY_LD_LIBRARY_PATH:?}"
+export DYLD_LIBRARY_PATH="${MY_LD_LIBRARY_PATH:?}"
+
+count=0
+for id in "${ids[@]}"; do
+ dir="data/$id"
+ label="$id: $(< $dir/===)"
+ [[ -e "$dir/in.yaml" ]] || continue
+ if grep "$id" test/libyaml-emitter.skip >/dev/null; then
+ echo "ok $((++count)) # SKIP $label"
+ continue
+ fi
+ want="$dir/out.yaml"
+ [[ -e $want ]] || want="$dir/in.yaml"
+ ./src/libyaml-emitter "$dir/test.event" > /tmp/test.out || {
+ (
+ cat "$dir/test.event"
+ cat "$want"
+ ) | sed 's/^/# /'
+ }
+ ok=true
+ output="$(${DIFF:-diff} -u $want /tmp/test.out)" || ok=false
+ if $ok; then
+ echo "ok $((++count)) $label"
+ else
+ echo "not ok $((++count)) $label"
+ echo "$output" | sed 's/^/# /'
+ fi
+done
+
+echo "1..$count"
diff --git a/test/libyaml-parser.skip b/test/libyaml-parser.skip
new file mode 100644
index 0000000..35f7e9b
--- /dev/null
+++ b/test/libyaml-parser.skip
@@ -0,0 +1,22 @@
+27NA # %YAML 1.2
+2JQS # Null keys
+2SXE # Colon in anchor
+4ABK # Null key
+6BCT # Test probably bad. tab after dash in sequence
+6LVF # Unknown directive
+6M2F # Null key
+6ZKB # %YAML 1.2
+A2M4 # Tab after dash in sequence. XXX?
+BEC7 # %YAML 1.3
+DBG4 # Colon in flow scalar
+FRK4 # XXX Why is explicit key in flow?
+KZN9 # Null key
+M7A3 # libyaml wants explicit --- for docs after ...
+N782 # --- and ... as flow values
+NHX8 # Null key
+R4YG # Tab char in possible indentation in folded scalar
+RTP8 # %YAML 1.2
+S3PD # Null key
+UT92 # Multiline plain key in flow does not work
+W4TN # %YAML 1.2
+WZ62 # Tagged empty values in flow mapping do not work
diff --git a/test/libyaml-parser.t b/test/libyaml-parser.t
new file mode 100755
index 0000000..c891df9
--- /dev/null
+++ b/test/libyaml-parser.t
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [[ $# -gt 0 ]]; then
+ ids=("$@")
+else
+ ids=(`find data | grep '/===$' | cut -d/ -f2 | sort`)
+fi
+
+count=0
+for id in "${ids[@]}"; do
+ dir="data/$id"
+ label="$id: $(< $dir/===)"
+ [[ -e "$dir/in.yaml" ]] || continue
+ if grep "$id" test/libyaml-parser.skip >/dev/null; then
+ echo "ok $((++count)) # SKIP $label"
+ continue
+ fi
+ ./src/libyaml-parser "$dir/in.yaml" > /tmp/test.out || {
+ (
+ cat "$dir/in.yaml"
+ cat "$dir/test.event"
+ ) | sed 's/^/# /'
+ }
+ ok=true
+ output="$(${DIFF:-diff} -u $dir/test.event /tmp/test.out)" || ok=false
+ if $ok; then
+ echo "ok $((++count)) $label"
+ else
+ echo "not ok $((++count)) $label"
+ echo "$output" | sed 's/^/# /'
+ fi
+done
+
+echo "1..$count"