diff options
author | David Robillard <d@drobilla.net> | 2011-04-28 21:56:29 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2011-04-28 21:56:29 +0000 |
commit | 809f5ae5999901be62f9d0cc1eb8a2d0f4806780 (patch) | |
tree | 4a2c1a7b344ec0f0a75d6a64ed1177a61822af89 /test | |
parent | 372ad8bcac948087bbc261933e38868f533c6708 (diff) | |
download | lilv-809f5ae5999901be62f9d0cc1eb8a2d0f4806780.tar.gz lilv-809f5ae5999901be62f9d0cc1eb8a2d0f4806780.tar.bz2 lilv-809f5ae5999901be62f9d0cc1eb8a2d0f4806780.zip |
Rename slv2 to lilv.
API breakage was proving too much of a hassle, and would be even further of a
mess after release and packaging. Best to make a clean break now, and fix
installation to support parallel installs and prevent this kind of problem in
the future.
git-svn-id: http://svn.drobilla.net/lad/trunk/lilv@3217 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'test')
-rw-r--r-- | test/lilv_test.c | 970 | ||||
-rw-r--r-- | test/slv2_test.c | 976 |
2 files changed, 970 insertions, 976 deletions
diff --git a/test/lilv_test.c b/test/lilv_test.c new file mode 100644 index 0000000..3c1396a --- /dev/null +++ b/test/lilv_test.c @@ -0,0 +1,970 @@ +/* Lilv Tests + * Copyright 2008-2011 David Robillard <http://drobilla.net> + * Copyright 2008 Krzysztof Foltman + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#define _XOPEN_SOURCE 600 + +#include <unistd.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <sys/stat.h> +#include <limits.h> +#include <float.h> +#include <math.h> + +#include "lilv/lilv.h" + +#define TEST_PATH_MAX 1024 + +static char bundle_dir_name[TEST_PATH_MAX]; +static char bundle_dir_uri[TEST_PATH_MAX]; +static char manifest_name[TEST_PATH_MAX]; +static char content_name[TEST_PATH_MAX]; + +static LilvWorld world; + +int test_count = 0; +int error_count = 0; + +void +delete_bundle() +{ + unlink(content_name); + unlink(manifest_name); + rmdir(bundle_dir_name); +} + +void +init_tests() +{ + strncpy(bundle_dir_name, getenv("HOME"), 900); + strcat(bundle_dir_name, "/.lv2/lilv-test.lv2"); + sprintf(bundle_dir_uri, "file://%s/", bundle_dir_name); + sprintf(manifest_name, "%s/manifest.ttl", bundle_dir_name); + sprintf(content_name, "%s/plugin.ttl", bundle_dir_name); + + delete_bundle(); +} + +void +fatal_error(const char *err, const char *arg) +{ + /* TODO: possibly change to vfprintf later */ + fprintf(stderr, err, arg); + /* IMHO, the bundle should be left in place after an error, for possible investigation */ + /* delete_bundle(); */ + exit(1); +} + +void +write_file(const char *name, const char *content) +{ + FILE* f = fopen(name, "w"); + size_t len = strlen(content); + if (fwrite(content, 1, len, f) != len) + fatal_error("Cannot write file %s\n", name); + fclose(f); +} + +int +init_world() +{ + world = lilv_world_new(); + return world != NULL; +} + +int +load_all_bundles() +{ + if (!init_world()) + return 0; + lilv_world_load_all(world); + return 1; +} + +void +create_bundle(char *manifest, char *content) +{ + if (mkdir(bundle_dir_name, 0700)) + fatal_error("Cannot create directory %s\n", bundle_dir_name); + write_file(manifest_name, manifest); + write_file(content_name, content); +} + +int +start_bundle(char *manifest, char *content) +{ + create_bundle(manifest, content); + return load_all_bundles(); +} + +void +unload_bundle() +{ + if (world) + lilv_world_free(world); + world = NULL; +} + +void +cleanup() +{ + delete_bundle(); +} + +/*****************************************************************************/ + +#define TEST_CASE(name) { #name, test_##name } +#define TEST_ASSERT(check) do {\ + test_count++;\ + if (!(check)) {\ + error_count++;\ + fprintf(stderr, "Failure at lilv_test.c:%d: %s\n", __LINE__, #check);\ + }\ +} while (0) + +typedef int (*TestFunc)(); + +struct TestCase { + const char *title; + TestFunc func; +}; + +#define PREFIX_LINE "@prefix : <http://example.org/> .\n" +#define PREFIX_LV2 "@prefix lv2: <http://lv2plug.in/ns/lv2core#> .\n" +#define PREFIX_LV2EV "@prefix lv2ev: <http://lv2plug.in/ns/ext/event#> . \n" +#define PREFIX_LV2UI "@prefix lv2ui: <http://lv2plug.in/ns/extensions/ui#> .\n" +#define PREFIX_RDF "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n" +#define PREFIX_RDFS "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n" +#define PREFIX_FOAF "@prefix foaf: <http://xmlns.com/foaf/0.1/> .\n" +#define PREFIX_DOAP "@prefix doap: <http://usefulinc.com/ns/doap#> .\n" + +#define MANIFEST_PREFIXES PREFIX_LINE PREFIX_LV2 PREFIX_RDFS +#define BUNDLE_PREFIXES PREFIX_LINE PREFIX_LV2 PREFIX_RDF PREFIX_RDFS PREFIX_FOAF PREFIX_DOAP +#define PLUGIN_NAME(name) "doap:name \"" name "\"" +#define LICENSE_GPL "doap:license <http://usefulinc.com/doap/licenses/gpl>" + +static char *uris_plugin = "http://example.org/plug"; +static LilvValue plugin_uri_value, plugin2_uri_value; + +/*****************************************************************************/ + +void +init_uris() +{ + plugin_uri_value = lilv_value_new_uri(world, uris_plugin); + plugin2_uri_value = lilv_value_new_uri(world, "http://example.org/foobar"); + TEST_ASSERT(plugin_uri_value); + TEST_ASSERT(plugin2_uri_value); +} + +void +cleanup_uris() +{ + lilv_value_free(plugin2_uri_value); + lilv_value_free(plugin_uri_value); + plugin2_uri_value = NULL; + plugin_uri_value = NULL; +} + +/*****************************************************************************/ + +int +test_utils() +{ + TEST_ASSERT(!strcmp(lilv_uri_to_path("file:///tmp/blah"), "/tmp/blah")); + TEST_ASSERT(!lilv_uri_to_path("file:/example.org/blah")); + TEST_ASSERT(!lilv_uri_to_path("http://example.org/blah")); + return 1; +} + +/*****************************************************************************/ + +int +test_value() +{ + if (!start_bundle(MANIFEST_PREFIXES + ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", + BUNDLE_PREFIXES + ":plug a lv2:Plugin ; a lv2:CompressorPlugin ; " + PLUGIN_NAME("Test plugin") " ; " + LICENSE_GPL " ; " + "lv2:port [ " + " a lv2:ControlPort ; a lv2:InputPort ; " + " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"Foo\" ; " + "] .")) + return 0; + + init_uris(); + + LilvValue uval = lilv_value_new_uri(world, "http://example.org"); + LilvValue sval = lilv_value_new_string(world, "Foo"); + LilvValue ival = lilv_value_new_int(world, 42); + LilvValue fval = lilv_value_new_float(world, 1.6180); + + TEST_ASSERT(lilv_value_is_uri(uval)); + TEST_ASSERT(lilv_value_is_string(sval)); + TEST_ASSERT(lilv_value_is_int(ival)); + TEST_ASSERT(lilv_value_is_float(fval)); + + TEST_ASSERT(!lilv_value_is_literal(uval)); + TEST_ASSERT(lilv_value_is_literal(sval)); + TEST_ASSERT(lilv_value_is_literal(ival)); + TEST_ASSERT(lilv_value_is_literal(fval)); + + TEST_ASSERT(!strcmp(lilv_value_as_uri(uval), "http://example.org")); + TEST_ASSERT(!strcmp(lilv_value_as_string(sval), "Foo")); + TEST_ASSERT(lilv_value_as_int(ival) == 42); + TEST_ASSERT(fabs(lilv_value_as_float(fval) - 1.6180) < FLT_EPSILON); + + char* tok = lilv_value_get_turtle_token(uval); + TEST_ASSERT(!strcmp(tok, "<http://example.org>")); + free(tok); + tok = lilv_value_get_turtle_token(sval); + TEST_ASSERT(!strcmp(tok, "Foo")); + free(tok); + tok = lilv_value_get_turtle_token(ival); + TEST_ASSERT(!strcmp(tok, "42")); + free(tok); + tok = lilv_value_get_turtle_token(fval); + TEST_ASSERT(!strncmp(tok, "1.6180", 6)); + free(tok); + + LilvValue uval_e = lilv_value_new_uri(world, "http://example.org"); + LilvValue sval_e = lilv_value_new_string(world, "Foo"); + LilvValue ival_e = lilv_value_new_int(world, 42); + LilvValue fval_e = lilv_value_new_float(world, 1.6180); + LilvValue uval_ne = lilv_value_new_uri(world, "http://no-example.org"); + LilvValue sval_ne = lilv_value_new_string(world, "Bar"); + LilvValue ival_ne = lilv_value_new_int(world, 24); + LilvValue fval_ne = lilv_value_new_float(world, 3.14159); + + TEST_ASSERT(lilv_value_equals(uval, uval_e)); + TEST_ASSERT(lilv_value_equals(sval, sval_e)); + TEST_ASSERT(lilv_value_equals(ival, ival_e)); + TEST_ASSERT(lilv_value_equals(fval, fval_e)); + + TEST_ASSERT(!lilv_value_equals(uval, uval_ne)); + TEST_ASSERT(!lilv_value_equals(sval, sval_ne)); + TEST_ASSERT(!lilv_value_equals(ival, ival_ne)); + TEST_ASSERT(!lilv_value_equals(fval, fval_ne)); + + TEST_ASSERT(!lilv_value_equals(uval, sval)); + TEST_ASSERT(!lilv_value_equals(sval, ival)); + TEST_ASSERT(!lilv_value_equals(ival, fval)); + + LilvValue uval_dup = lilv_value_duplicate(uval); + TEST_ASSERT(lilv_value_equals(uval, uval_dup)); + + LilvValue ifval = lilv_value_new_float(world, 42.0); + TEST_ASSERT(!lilv_value_equals(ival, ifval)); + lilv_value_free(ifval); + + LilvValue nil = NULL; + TEST_ASSERT(!lilv_value_equals(uval, nil)); + TEST_ASSERT(!lilv_value_equals(nil, uval)); + TEST_ASSERT(lilv_value_equals(nil, nil)); + + LilvValue nil2 = lilv_value_duplicate(nil); + TEST_ASSERT(lilv_value_equals(nil, nil2)); + + lilv_value_free(uval); + lilv_value_free(sval); + lilv_value_free(ival); + lilv_value_free(fval); + lilv_value_free(uval_e); + lilv_value_free(sval_e); + lilv_value_free(ival_e); + lilv_value_free(fval_e); + lilv_value_free(uval_ne); + lilv_value_free(sval_ne); + lilv_value_free(ival_ne); + lilv_value_free(fval_ne); + lilv_value_free(uval_dup); + lilv_value_free(nil2); + + cleanup_uris(); + return 1; +} + +/*****************************************************************************/ + +static int discovery_plugin_found = 0; + +static void +discovery_verify_plugin(LilvPlugin plugin) +{ + LilvValue value = lilv_plugin_get_uri(plugin); + if (lilv_value_equals(value, plugin_uri_value)) { + LilvValue lib_uri = NULL; + TEST_ASSERT(!lilv_value_equals(value, plugin2_uri_value)); + discovery_plugin_found = 1; + lib_uri = lilv_plugin_get_library_uri(plugin); + TEST_ASSERT(lib_uri); + TEST_ASSERT(lilv_value_is_uri(lib_uri)); + TEST_ASSERT(lilv_value_as_uri(lib_uri)); + TEST_ASSERT(strstr(lilv_value_as_uri(lib_uri), "foo.so")); + TEST_ASSERT(lilv_plugin_verify(plugin)); + } +} + +int +test_discovery() +{ + if (!start_bundle(MANIFEST_PREFIXES + ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", + BUNDLE_PREFIXES + ":plug a lv2:Plugin ;" + PLUGIN_NAME("Test plugin") " ; " + LICENSE_GPL " ; " + "lv2:port [ a lv2:ControlPort ; a lv2:InputPort ;" + " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"bar\" ; ] .")) + return 0; + + init_uris(); + + LilvPlugins plugins = lilv_world_get_all_plugins(world); + TEST_ASSERT(lilv_plugins_size(plugins) > 0); + + LilvPlugin explug = lilv_plugins_get_by_uri(plugins, plugin_uri_value); + TEST_ASSERT(explug != NULL); + LilvPlugin explug2 = lilv_plugins_get_by_uri(plugins, plugin2_uri_value); + TEST_ASSERT(explug2 == NULL); + + if (explug) { + LilvValue name = lilv_plugin_get_name(explug); + TEST_ASSERT(!strcmp(lilv_value_as_string(name), "Test plugin")); + lilv_value_free(name); + } + + discovery_plugin_found = 0; + LILV_FOREACH(plugins, i, plugins) + discovery_verify_plugin(lilv_plugins_get(plugins, i)); + + TEST_ASSERT(discovery_plugin_found); + plugins = NULL; + + cleanup_uris(); + + return 1; +} + +/*****************************************************************************/ + +int +test_verify() +{ + if (!start_bundle(MANIFEST_PREFIXES + ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", + BUNDLE_PREFIXES + ":plug a lv2:Plugin ; " + PLUGIN_NAME("Test plugin") " ; " + LICENSE_GPL " ; " + "lv2:port [ a lv2:ControlPort ; a lv2:InputPort ;" + " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"bar\" ] .")) + return 0; + + init_uris(); + LilvPlugins plugins = lilv_world_get_all_plugins(world); + LilvPlugin explug = lilv_plugins_get_by_uri(plugins, plugin_uri_value); + TEST_ASSERT(explug); + TEST_ASSERT(lilv_plugin_verify(explug)); + cleanup_uris(); + return 1; +} + +/*****************************************************************************/ + +int +test_no_verify() +{ + if (!start_bundle(MANIFEST_PREFIXES + ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", + BUNDLE_PREFIXES + ":plug a lv2:Plugin . ")) + return 0; + + init_uris(); + LilvPlugins plugins = lilv_world_get_all_plugins(world); + LilvPlugin explug = lilv_plugins_get_by_uri(plugins, plugin_uri_value); + TEST_ASSERT(explug); + TEST_ASSERT(!lilv_plugin_verify(explug)); + cleanup_uris(); + return 1; +} + +/*****************************************************************************/ + +int +test_classes() +{ + if (!start_bundle(MANIFEST_PREFIXES + ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", + BUNDLE_PREFIXES + ":plug a lv2:Plugin ; a lv2:CompressorPlugin ; " + PLUGIN_NAME("Test plugin") " ; " + LICENSE_GPL " ; " + "lv2:port [ " + " a lv2:ControlPort ; a lv2:InputPort ; " + " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"Foo\" ; " + "] .")) + return 0; + + init_uris(); + LilvPluginClass plugin = lilv_world_get_plugin_class(world); + LilvPluginClasses classes = lilv_world_get_plugin_classes(world); + LilvPluginClasses children = lilv_plugin_class_get_children(plugin); + + TEST_ASSERT(lilv_plugin_class_get_parent_uri(plugin) == NULL); + TEST_ASSERT(lilv_plugin_classes_size(classes) > lilv_plugin_classes_size(children)); + TEST_ASSERT(!strcmp(lilv_value_as_string(lilv_plugin_class_get_label(plugin)), "Plugin")); + TEST_ASSERT(!strcmp(lilv_value_as_string(lilv_plugin_class_get_uri(plugin)), + "http://lv2plug.in/ns/lv2core#Plugin")); + + LILV_FOREACH(plugin_classes, i, children) { + TEST_ASSERT(lilv_value_equals( + lilv_plugin_class_get_parent_uri(lilv_plugin_classes_get(children, i)), + lilv_plugin_class_get_uri(plugin))); + } + + LilvValue some_uri = lilv_value_new_uri(world, "http://example.org/whatever"); + TEST_ASSERT(lilv_plugin_classes_get_by_uri(classes, some_uri) == NULL); + lilv_value_free(some_uri); + + lilv_plugin_classes_free(children); + + cleanup_uris(); + return 1; +} + +/*****************************************************************************/ + +int +test_plugin() +{ + if (!start_bundle(MANIFEST_PREFIXES + ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", + BUNDLE_PREFIXES + ":plug a lv2:Plugin ; a lv2:CompressorPlugin ; " + PLUGIN_NAME("Test plugin") " ; " + LICENSE_GPL " ; " + "lv2:optionalFeature lv2:hardRTCapable ; " + "lv2:requiredFeature <http://lv2plug.in/ns/ext/event> ; " + ":foo 1.6180 ; " + ":bar true ; " + ":baz false ; " + "doap:maintainer [ foaf:name \"David Robillard\" ; " + " foaf:homepage <http://drobilla.net> ; foaf:mbox <mailto:d@drobilla.net> ] ; " + "lv2:port [ " + " a lv2:ControlPort ; a lv2:InputPort ; " + " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"bar\" ; " + " lv2:minimum -1.0 ; lv2:maximum 1.0 ; lv2:default 0.5 " + "] , [ " + " a lv2:ControlPort ; a lv2:InputPort ; " + " lv2:index 1 ; lv2:symbol \"bar\" ; lv2:name \"Baz\" ; " + " lv2:minimum -2.0 ; lv2:maximum 2.0 ; lv2:default 1.0 " + "] , [ " + " a lv2:ControlPort ; a lv2:OutputPort ; " + " lv2:index 2 ; lv2:symbol \"latency\" ; lv2:name \"Latency\" ; " + " lv2:portProperty lv2:reportsLatency " + "] . \n" + ":thing doap:name \"Something else\" .\n")) + return 0; + + init_uris(); + LilvPlugins plugins = lilv_world_get_all_plugins(world); + LilvPlugin plug = lilv_plugins_get_by_uri(plugins, plugin_uri_value); + TEST_ASSERT(plug); + + LilvPluginClass class = lilv_plugin_get_class(plug); + LilvValue class_uri = lilv_plugin_class_get_uri(class); + TEST_ASSERT(!strcmp(lilv_value_as_string(class_uri), + "http://lv2plug.in/ns/lv2core#CompressorPlugin")); + + LilvValue plug_bundle_uri = lilv_plugin_get_bundle_uri(plug); + TEST_ASSERT(!strcmp(lilv_value_as_string(plug_bundle_uri), bundle_dir_uri)); + + LilvValues data_uris = lilv_plugin_get_data_uris(plug); + TEST_ASSERT(lilv_values_size(data_uris) == 2); + + char* manifest_uri = (char*)malloc(TEST_PATH_MAX); + char* data_uri = (char*)malloc(TEST_PATH_MAX); + snprintf(manifest_uri, TEST_PATH_MAX, "%s%s", + lilv_value_as_string(plug_bundle_uri), "manifest.ttl"); + snprintf(data_uri, TEST_PATH_MAX, "%s%s", + lilv_value_as_string(plug_bundle_uri), "plugin.ttl"); + + LilvValue manifest_uri_val = lilv_value_new_uri(world, manifest_uri); + TEST_ASSERT(lilv_values_contains(data_uris, manifest_uri_val)); + lilv_value_free(manifest_uri_val); + + LilvValue data_uri_val = lilv_value_new_uri(world, data_uri); + TEST_ASSERT(lilv_values_contains(data_uris, data_uri_val)); + lilv_value_free(data_uri_val); + + free(manifest_uri); + free(data_uri); + + float mins[1]; + float maxs[1]; + float defs[1]; + lilv_plugin_get_port_ranges_float(plug, mins, maxs, defs); + TEST_ASSERT(mins[0] == -1.0f); + TEST_ASSERT(maxs[0] == 1.0f); + TEST_ASSERT(defs[0] == 0.5f); + + LilvValue audio_class = lilv_value_new_uri(world, + "http://lv2plug.in/ns/lv2core#AudioPort"); + LilvValue control_class = lilv_value_new_uri(world, + "http://lv2plug.in/ns/lv2core#ControlPort"); + LilvValue in_class = lilv_value_new_uri(world, + "http://lv2plug.in/ns/lv2core#InputPort"); + LilvValue out_class = lilv_value_new_uri(world, + "http://lv2plug.in/ns/lv2core#OutputPort"); + + TEST_ASSERT(lilv_plugin_get_num_ports_of_class(plug, control_class, NULL) == 3); + TEST_ASSERT(lilv_plugin_get_num_ports_of_class(plug, audio_class, NULL) == 0); + TEST_ASSERT(lilv_plugin_get_num_ports_of_class(plug, in_class, NULL) == 2); + TEST_ASSERT(lilv_plugin_get_num_ports_of_class(plug, out_class, NULL) == 1); + TEST_ASSERT(lilv_plugin_get_num_ports_of_class(plug, control_class, in_class, NULL) == 2); + TEST_ASSERT(lilv_plugin_get_num_ports_of_class(plug, control_class, out_class, NULL) == 1); + TEST_ASSERT(lilv_plugin_get_num_ports_of_class(plug, audio_class, in_class, NULL) == 0); + TEST_ASSERT(lilv_plugin_get_num_ports_of_class(plug, audio_class, out_class, NULL) == 0); + + TEST_ASSERT(lilv_plugin_has_latency(plug)); + TEST_ASSERT(lilv_plugin_get_latency_port_index(plug) == 2); + + LilvValue rt_feature = lilv_value_new_uri(world, + "http://lv2plug.in/ns/lv2core#hardRTCapable"); + LilvValue event_feature = lilv_value_new_uri(world, + "http://lv2plug.in/ns/ext/event"); + LilvValue pretend_feature = lilv_value_new_uri(world, + "http://example.org/solvesWorldHunger"); + + TEST_ASSERT(lilv_plugin_has_feature(plug, rt_feature)); + TEST_ASSERT(lilv_plugin_has_feature(plug, event_feature)); + TEST_ASSERT(!lilv_plugin_has_feature(plug, pretend_feature)); + + lilv_value_free(rt_feature); + lilv_value_free(event_feature); + lilv_value_free(pretend_feature); + + LilvValues supported = lilv_plugin_get_supported_features(plug); + LilvValues required = lilv_plugin_get_required_features(plug); + LilvValues optional = lilv_plugin_get_optional_features(plug); + TEST_ASSERT(lilv_values_size(supported) == 2); + TEST_ASSERT(lilv_values_size(required) == 1); + TEST_ASSERT(lilv_values_size(optional) == 1); + lilv_values_free(supported); + lilv_values_free(required); + lilv_values_free(optional); + + LilvValue foo_p = lilv_value_new_uri(world, "http://example.org/foo"); + LilvValues foos = lilv_plugin_get_value(plug, foo_p); + TEST_ASSERT(lilv_values_size(foos) == 1); + TEST_ASSERT(fabs(lilv_value_as_float(lilv_values_get_first(foos)) - 1.6180) < FLT_EPSILON); + lilv_value_free(foo_p); + lilv_values_free(foos); + + LilvValue bar_p = lilv_value_new_uri(world, "http://example.org/bar"); + LilvValues bars = lilv_plugin_get_value(plug, bar_p); + TEST_ASSERT(lilv_values_size(bars) == 1); + TEST_ASSERT(lilv_value_as_bool(lilv_values_get_first(bars)) == true); + lilv_value_free(bar_p); + lilv_values_free(bars); + + LilvValue baz_p = lilv_value_new_uri(world, "http://example.org/baz"); + LilvValues bazs = lilv_plugin_get_value(plug, baz_p); + TEST_ASSERT(lilv_values_size(bazs) == 1); + TEST_ASSERT(lilv_value_as_bool(lilv_values_get_first(bazs)) == false); + lilv_value_free(baz_p); + lilv_values_free(bazs); + + LilvValue author_name = lilv_plugin_get_author_name(plug); + TEST_ASSERT(!strcmp(lilv_value_as_string(author_name), "David Robillard")); + lilv_value_free(author_name); + + LilvValue author_email = lilv_plugin_get_author_email(plug); + TEST_ASSERT(!strcmp(lilv_value_as_string(author_email), "mailto:d@drobilla.net")); + lilv_value_free(author_email); + + LilvValue author_homepage = lilv_plugin_get_author_homepage(plug); + TEST_ASSERT(!strcmp(lilv_value_as_string(author_homepage), "http://drobilla.net")); + lilv_value_free(author_homepage); + + LilvValue thing_uri = lilv_value_new_uri(world, "http://example.org/thing"); + LilvValue name_p = lilv_value_new_uri(world, "http://usefulinc.com/ns/doap#name"); + LilvValues thing_names = lilv_plugin_get_value_for_subject(plug, thing_uri, name_p); + TEST_ASSERT(lilv_values_size(thing_names) == 1); + LilvValue thing_name = lilv_values_get_first(thing_names); + TEST_ASSERT(thing_name); + TEST_ASSERT(lilv_value_is_string(thing_name)); + TEST_ASSERT(!strcmp(lilv_value_as_string(thing_name), "Something else")); + + LilvUIs uis = lilv_plugin_get_uis(plug); + TEST_ASSERT(lilv_uis_size(uis) == 0); + lilv_uis_free(uis); + + lilv_values_free(thing_names); + lilv_value_free(thing_uri); + lilv_value_free(name_p); + lilv_value_free(control_class); + lilv_value_free(audio_class); + lilv_value_free(in_class); + lilv_value_free(out_class); + cleanup_uris(); + return 1; +} + +/*****************************************************************************/ + +int +test_port() +{ + if (!start_bundle(MANIFEST_PREFIXES + ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", + BUNDLE_PREFIXES PREFIX_LV2EV + ":plug a lv2:Plugin ; " + PLUGIN_NAME("Test plugin") " ; " + LICENSE_GPL " ; " + "doap:homepage <http://example.org/someplug> ; " + "lv2:port [ " + " a lv2:ControlPort ; a lv2:InputPort ; " + " lv2:index 0 ; lv2:symbol \"foo\" ; " + " lv2:name \"store\" ; " + " lv2:name \"dépanneur\"@fr-ca ; lv2:name \"épicerie\"@fr-fr ; " + " lv2:name \"tienda\"@es ; " + " lv2:portProperty lv2:integer ; " + " lv2:minimum -1.0 ; lv2:maximum 1.0 ; lv2:default 0.5 ; " + " lv2:scalePoint [ rdfs:label \"Sin\"; rdf:value 3 ] ; " + " lv2:scalePoint [ rdfs:label \"Cos\"; rdf:value 4 ] " + "] , [\n" + " a lv2:EventPort ; a lv2:InputPort ; " + " lv2:index 1 ; lv2:symbol \"event_in\" ; " + " lv2:name \"Event Input\" ; " + " lv2ev:supportsEvent <http://example.org/event> " + "] .")) + return 0; + + init_uris(); + LilvPlugins plugins = lilv_world_get_all_plugins(world); + LilvPlugin plug = lilv_plugins_get_by_uri(plugins, plugin_uri_value); + TEST_ASSERT(plug); + + LilvValue psym = lilv_value_new_string(world, "foo"); + LilvPort p = lilv_plugin_get_port_by_index(plug, 0); + LilvPort p2 = lilv_plugin_get_port_by_symbol(plug, psym); + lilv_value_free(psym); + TEST_ASSERT(p != NULL); + TEST_ASSERT(p2 != NULL); + TEST_ASSERT(p == p2); + + LilvValue nopsym = lilv_value_new_string(world, "thisaintnoportfoo"); + LilvPort p3 = lilv_plugin_get_port_by_symbol(plug, nopsym); + TEST_ASSERT(p3 == NULL); + lilv_value_free(nopsym); + + LilvValue audio_class = lilv_value_new_uri(world, + "http://lv2plug.in/ns/lv2core#AudioPort"); + LilvValue control_class = lilv_value_new_uri(world, + "http://lv2plug.in/ns/lv2core#ControlPort"); + LilvValue in_class = lilv_value_new_uri(world, + "http://lv2plug.in/ns/lv2core#InputPort"); + + TEST_ASSERT(lilv_values_size(lilv_port_get_classes(plug, p)) == 2); + TEST_ASSERT(lilv_plugin_get_num_ports(plug) == 2); + TEST_ASSERT(lilv_port_is_a(plug, p, control_class)); + TEST_ASSERT(lilv_port_is_a(plug, p, in_class)); + TEST_ASSERT(!lilv_port_is_a(plug, p, audio_class)); + + LilvValues port_properties = lilv_port_get_properties(plug, p); + TEST_ASSERT(lilv_values_size(port_properties) == 1); + lilv_values_free(port_properties); + + // Untranslated name (current locale is set to "C" in main) + TEST_ASSERT(!strcmp(lilv_value_as_string(lilv_port_get_symbol(plug, p)), "foo")); + LilvValue name = lilv_port_get_name(plug, p); + TEST_ASSERT(!strcmp(lilv_value_as_string(name), "store")); + lilv_value_free(name); + + // Exact language match + setenv("LANG", "fr_FR", 1); + name = lilv_port_get_name(plug, p); + TEST_ASSERT(!strcmp(lilv_value_as_string(name), "épicerie")); + lilv_value_free(name); + + // Exact language match (with charset suffix) + setenv("LANG", "fr_CA.utf8", 1); + name = lilv_port_get_name(plug, p); + TEST_ASSERT(!strcmp(lilv_value_as_string(name), "dépanneur")); + lilv_value_free(name); + + // Partial language match (choose value translated for different country) + setenv("LANG", "fr_BE", 1); + name = lilv_port_get_name(plug, p); + TEST_ASSERT((!strcmp(lilv_value_as_string(name), "dépanneur")) + ||(!strcmp(lilv_value_as_string(name), "épicerie"))); + lilv_value_free(name); + + // Partial language match (choose country-less language tagged value) + setenv("LANG", "es_MX", 1); + name = lilv_port_get_name(plug, p); + TEST_ASSERT(!strcmp(lilv_value_as_string(name), "tienda")); + lilv_value_free(name); + + setenv("LANG", "C", 1); // Reset locale + + LilvScalePoints points = lilv_port_get_scale_points(plug, p); + TEST_ASSERT(lilv_scale_points_size(points) == 2); + + LilvIter sp_iter = lilv_scale_points_begin(points); + LilvScalePoint sp0 = lilv_scale_points_get(points, sp_iter); + TEST_ASSERT(sp0); + lilv_scale_points_next(points, sp_iter); + LilvScalePoint sp1 = lilv_scale_points_get(points, sp_iter); + TEST_ASSERT(sp1); + + TEST_ASSERT(!strcmp(lilv_value_as_string(lilv_scale_point_get_label(sp0)), "Sin")); + TEST_ASSERT(lilv_value_as_float(lilv_scale_point_get_value(sp0)) == 3); + TEST_ASSERT(!strcmp(lilv_value_as_string(lilv_scale_point_get_label(sp1)), "Cos")); + TEST_ASSERT(lilv_value_as_float(lilv_scale_point_get_value(sp1)) == 4); + + LilvValue homepage_p = lilv_value_new_uri(world, "http://usefulinc.com/ns/doap#homepage"); + LilvValues homepages = lilv_plugin_get_value(plug, homepage_p); + TEST_ASSERT(lilv_values_size(homepages) == 1); + TEST_ASSERT(!strcmp(lilv_value_as_string(lilv_values_get_first(homepages)), + "http://example.org/someplug")); + + LilvValue min, max, def; + lilv_port_get_range(plug, p, &def, &min, &max); + TEST_ASSERT(def); + TEST_ASSERT(min); + TEST_ASSERT(max); + TEST_ASSERT(lilv_value_as_float(def) == 0.5); + TEST_ASSERT(lilv_value_as_float(min) == -1.0); + TEST_ASSERT(lilv_value_as_float(max) == 1.0); + + LilvValue integer_prop = lilv_value_new_uri(world, "http://lv2plug.in/ns/lv2core#integer"); + LilvValue toggled_prop = lilv_value_new_uri(world, "http://lv2plug.in/ns/lv2core#toggled"); + + TEST_ASSERT(lilv_port_has_property(plug, p, integer_prop)); + TEST_ASSERT(!lilv_port_has_property(plug, p, toggled_prop)); + + LilvPort ep = lilv_plugin_get_port_by_index(plug, 1); + + LilvValue event_type = lilv_value_new_uri(world, "http://example.org/event"); + LilvValue event_type_2 = lilv_value_new_uri(world, "http://example.org/otherEvent"); + TEST_ASSERT(lilv_port_supports_event(plug, ep, event_type)); + TEST_ASSERT(!lilv_port_supports_event(plug, ep, event_type_2)); + + LilvValue name_p = lilv_value_new_uri(world, "http://lv2plug.in/ns/lv2core#name"); + LilvValues names = lilv_port_get_value(plug, p, name_p); + TEST_ASSERT(lilv_values_size(names) == 1); + TEST_ASSERT(!strcmp(lilv_value_as_string(lilv_values_get_first(names)), + "store")); + lilv_values_free(names); + + LilvValue true_val = lilv_value_new_bool(world, true); + LilvValue false_val = lilv_value_new_bool(world, false); + + lilv_world_set_option(world, LILV_OPTION_FILTER_LANG, false_val); + names = lilv_port_get_value(plug, p, name_p); + TEST_ASSERT(lilv_values_size(names) == 4); + lilv_values_free(names); + lilv_world_set_option(world, LILV_OPTION_FILTER_LANG, true_val); + + lilv_value_free(false_val); + lilv_value_free(true_val); + + names = lilv_port_get_value(plug, ep, name_p); + TEST_ASSERT(lilv_values_size(names) == 1); + TEST_ASSERT(!strcmp(lilv_value_as_string(lilv_values_get_first(names)), + "Event Input")); + lilv_values_free(names); + lilv_value_free(name_p); + + lilv_value_free(integer_prop); + lilv_value_free(toggled_prop); + lilv_value_free(event_type); + lilv_value_free(event_type_2); + + lilv_value_free(min); + lilv_value_free(max); + lilv_value_free(def); + + lilv_value_free(homepage_p); + lilv_values_free(homepages); + + lilv_scale_points_free(points); + lilv_value_free(control_class); + lilv_value_free(audio_class); + lilv_value_free(in_class); + cleanup_uris(); + return 1; +} + +/*****************************************************************************/ + +int +test_ui() +{ + if (!start_bundle(MANIFEST_PREFIXES + ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", + BUNDLE_PREFIXES PREFIX_LV2UI + ":plug a lv2:Plugin ; a lv2:CompressorPlugin ; " + PLUGIN_NAME("Test plugin") " ; " + LICENSE_GPL " ; " + "lv2:optionalFeature lv2:hardRTCapable ; " + "lv2:requiredFeature <http://lv2plug.in/ns/ext/event> ; " + "lv2ui:ui :ui , :ui2 , :ui3 , :ui4 ; " + "doap:maintainer [ foaf:name \"David Robillard\" ; " + " foaf:homepage <http://drobilla.net> ; foaf:mbox <mailto:d@drobilla.net> ] ; " + "lv2:port [ " + " a lv2:ControlPort ; a lv2:InputPort ; " + " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"bar\" ; " + " lv2:minimum -1.0 ; lv2:maximum 1.0 ; lv2:default 0.5 " + "] , [ " + " a lv2:ControlPort ; a lv2:InputPort ; " + " lv2:index 1 ; lv2:symbol \"bar\" ; lv2:name \"Baz\" ; " + " lv2:minimum -2.0 ; lv2:maximum 2.0 ; lv2:default 1.0 " + "] , [ " + " a lv2:ControlPort ; a lv2:OutputPort ; " + " lv2:index 2 ; lv2:symbol \"latency\" ; lv2:name \"Latency\" ; " + " lv2:portProperty lv2:reportsLatency " + "] .\n" + ":ui a lv2ui:GtkUI ; " + " lv2ui:requiredFeature lv2ui:makeResident ; " + " lv2ui:binary <ui.so> ; " + " lv2ui:optionalFeature lv2ui:ext_presets . " + ":ui2 a lv2ui:GtkUI ; lv2ui:binary <ui2.so> . " + ":ui3 a lv2ui:GtkUI ; lv2ui:binary <ui3.so> . " + ":ui4 a lv2ui:GtkUI ; lv2ui:binary <ui4.so> . ")) + return 0; + + init_uris(); + LilvPlugins plugins = lilv_world_get_all_plugins(world); + LilvPlugin plug = lilv_plugins_get_by_uri(plugins, plugin_uri_value); + TEST_ASSERT(plug); + + LilvUIs uis = lilv_plugin_get_uis(plug); + TEST_ASSERT(lilv_uis_size(uis) == 4); + + LilvUI ui0 = lilv_uis_get(uis, lilv_uis_begin(uis)); + TEST_ASSERT(ui0); + + LilvValue ui_uri = lilv_value_new_uri(world, "http://example.org/ui"); + LilvValue ui2_uri = lilv_value_new_uri(world, "http://example.org/ui3"); + LilvValue ui3_uri = lilv_value_new_uri(world, "http://example.org/ui4"); + LilvValue noui_uri = lilv_value_new_uri(world, "http://example.org/notaui"); + + LilvUI ui0_2 = lilv_uis_get_by_uri(uis, ui_uri); + TEST_ASSERT(ui0 == ui0_2); + + LilvUI ui2 = lilv_uis_get_by_uri(uis, ui2_uri); + TEST_ASSERT(ui2 != ui0); + + LilvUI ui3 = lilv_uis_get_by_uri(uis, ui3_uri); + TEST_ASSERT(ui3 != ui0); + + LilvUI noui = lilv_uis_get_by_uri(uis, noui_uri); + TEST_ASSERT(noui == NULL); + + LilvValues classes = lilv_ui_get_classes(ui0); + TEST_ASSERT(lilv_values_size(classes) == 1); + + LilvValue ui_class_uri = lilv_value_new_uri(world, + "http://lv2plug.in/ns/extensions/ui#GtkUI"); + + TEST_ASSERT(lilv_value_equals(lilv_values_get_first(classes), ui_class_uri)); + TEST_ASSERT(lilv_ui_is_a(ui0, ui_class_uri)); + + LilvValue plug_bundle_uri = lilv_plugin_get_bundle_uri(plug); + LilvValue ui_bundle_uri = lilv_ui_get_bundle_uri(ui0); + TEST_ASSERT(lilv_value_equals(plug_bundle_uri, ui_bundle_uri)); + + char* ui_binary_uri_str = (char*)malloc(TEST_PATH_MAX); + snprintf(ui_binary_uri_str, TEST_PATH_MAX, "%s%s", + lilv_value_as_string(plug_bundle_uri), "ui.so"); + + LilvValue ui_binary_uri = lilv_ui_get_binary_uri(ui0); + + LilvValue expected_uri = lilv_value_new_uri(world, ui_binary_uri_str); + TEST_ASSERT(lilv_value_equals(expected_uri, ui_binary_uri)); + + free(ui_binary_uri_str); + lilv_value_free(ui_class_uri); + lilv_value_free(ui_uri); + lilv_value_free(ui2_uri); + lilv_value_free(ui3_uri); + lilv_value_free(noui_uri); + lilv_value_free(expected_uri); + lilv_uis_free(uis); + + cleanup_uris(); + return 1; +} + +/*****************************************************************************/ + +/* add tests here */ +static struct TestCase tests[] = { + TEST_CASE(utils), + TEST_CASE(value), + TEST_CASE(verify), + TEST_CASE(no_verify), + TEST_CASE(discovery), + TEST_CASE(classes), + TEST_CASE(plugin), + TEST_CASE(port), + TEST_CASE(ui), + { NULL, NULL } +}; + +void +run_tests() +{ + int i; + for (i = 0; tests[i].title; i++) { + printf("*** Test %s\n", tests[i].title); + if (!tests[i].func()) { + printf("\nTest failed\n"); + /* test case that wasn't able to be executed at all counts as 1 test + 1 error */ + error_count++; + test_count++; + } + unload_bundle(); + cleanup(); + } +} + +int +main(int argc, char *argv[]) +{ + if (argc != 1) { + printf("Syntax: %s\n", argv[0]); + return 0; + } + setenv("LANG", "C", 1); + init_tests(); + run_tests(); + cleanup(); + printf("\n*** Test Results: %d tests, %d errors\n\n", test_count, error_count); + return error_count ? 1 : 0; +} diff --git a/test/slv2_test.c b/test/slv2_test.c deleted file mode 100644 index 0c2ad2e..0000000 --- a/test/slv2_test.c +++ /dev/null @@ -1,976 +0,0 @@ -/* SLV2 Tests - * Copyright 2008-2011 David Robillard <http://drobilla.net> - * Copyright 2008 Krzysztof Foltman - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#define _XOPEN_SOURCE 600 - -#include <unistd.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <assert.h> -#include <sys/stat.h> -#include <limits.h> -#include <float.h> -#include <math.h> - -#include "slv2/slv2.h" - -#define TEST_PATH_MAX 1024 - -static char bundle_dir_name[TEST_PATH_MAX]; -static char bundle_dir_uri[TEST_PATH_MAX]; -static char manifest_name[TEST_PATH_MAX]; -static char content_name[TEST_PATH_MAX]; - -static SLV2World world; - -int test_count = 0; -int error_count = 0; - -void -delete_bundle() -{ - unlink(content_name); - unlink(manifest_name); - rmdir(bundle_dir_name); -} - -void -init_tests() -{ - strncpy(bundle_dir_name, getenv("HOME"), 900); - strcat(bundle_dir_name, "/.lv2/slv2-test.lv2"); - sprintf(bundle_dir_uri, "file://%s/", bundle_dir_name); - sprintf(manifest_name, "%s/manifest.ttl", bundle_dir_name); - sprintf(content_name, "%s/plugin.ttl", bundle_dir_name); - - delete_bundle(); -} - -void -fatal_error(const char *err, const char *arg) -{ - /* TODO: possibly change to vfprintf later */ - fprintf(stderr, err, arg); - /* IMHO, the bundle should be left in place after an error, for possible investigation */ - /* delete_bundle(); */ - exit(1); -} - -void -write_file(const char *name, const char *content) -{ - FILE* f = fopen(name, "w"); - size_t len = strlen(content); - if (fwrite(content, 1, len, f) != len) - fatal_error("Cannot write file %s\n", name); - fclose(f); -} - -int -init_world() -{ - world = slv2_world_new(); - return world != NULL; -} - -int -load_all_bundles() -{ - if (!init_world()) - return 0; - slv2_world_load_all(world); - return 1; -} - -void -create_bundle(char *manifest, char *content) -{ - if (mkdir(bundle_dir_name, 0700)) - fatal_error("Cannot create directory %s\n", bundle_dir_name); - write_file(manifest_name, manifest); - write_file(content_name, content); -} - -int -start_bundle(char *manifest, char *content) -{ - create_bundle(manifest, content); - return load_all_bundles(); -} - -void -unload_bundle() -{ - if (world) - slv2_world_free(world); - world = NULL; -} - -void -cleanup() -{ - delete_bundle(); -} - -/*****************************************************************************/ - -#define TEST_CASE(name) { #name, test_##name } -#define TEST_ASSERT(check) do {\ - test_count++;\ - if (!(check)) {\ - error_count++;\ - fprintf(stderr, "Failure at slv2_test.c:%d: %s\n", __LINE__, #check);\ - }\ -} while (0) - -typedef int (*TestFunc)(); - -struct TestCase { - const char *title; - TestFunc func; -}; - -#define PREFIX_LINE "@prefix : <http://example.org/> .\n" -#define PREFIX_LV2 "@prefix lv2: <http://lv2plug.in/ns/lv2core#> .\n" -#define PREFIX_LV2EV "@prefix lv2ev: <http://lv2plug.in/ns/ext/event#> . \n" -#define PREFIX_LV2UI "@prefix lv2ui: <http://lv2plug.in/ns/extensions/ui#> .\n" -#define PREFIX_RDF "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n" -#define PREFIX_RDFS "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n" -#define PREFIX_FOAF "@prefix foaf: <http://xmlns.com/foaf/0.1/> .\n" -#define PREFIX_DOAP "@prefix doap: <http://usefulinc.com/ns/doap#> .\n" - -#define MANIFEST_PREFIXES PREFIX_LINE PREFIX_LV2 PREFIX_RDFS -#define BUNDLE_PREFIXES PREFIX_LINE PREFIX_LV2 PREFIX_RDF PREFIX_RDFS PREFIX_FOAF PREFIX_DOAP -#define PLUGIN_NAME(name) "doap:name \"" name "\"" -#define LICENSE_GPL "doap:license <http://usefulinc.com/doap/licenses/gpl>" - -static char *uris_plugin = "http://example.org/plug"; -static SLV2Value plugin_uri_value, plugin2_uri_value; - -/*****************************************************************************/ - -void -init_uris() -{ - plugin_uri_value = slv2_value_new_uri(world, uris_plugin); - plugin2_uri_value = slv2_value_new_uri(world, "http://example.org/foobar"); - TEST_ASSERT(plugin_uri_value); - TEST_ASSERT(plugin2_uri_value); -} - -void -cleanup_uris() -{ - slv2_value_free(plugin2_uri_value); - slv2_value_free(plugin_uri_value); - plugin2_uri_value = NULL; - plugin_uri_value = NULL; -} - -/*****************************************************************************/ - -int -test_utils() -{ - TEST_ASSERT(!strcmp(slv2_uri_to_path("file:///tmp/blah"), "/tmp/blah")); - TEST_ASSERT(!slv2_uri_to_path("file:/example.org/blah")); - TEST_ASSERT(!slv2_uri_to_path("http://example.org/blah")); - return 1; -} - -/*****************************************************************************/ - -int -test_value() -{ - if (!start_bundle(MANIFEST_PREFIXES - ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", - BUNDLE_PREFIXES - ":plug a lv2:Plugin ; a lv2:CompressorPlugin ; " - PLUGIN_NAME("Test plugin") " ; " - LICENSE_GPL " ; " - "lv2:port [ " - " a lv2:ControlPort ; a lv2:InputPort ; " - " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"Foo\" ; " - "] .")) - return 0; - - init_uris(); - - SLV2Value uval = slv2_value_new_uri(world, "http://example.org"); - SLV2Value sval = slv2_value_new_string(world, "Foo"); - SLV2Value ival = slv2_value_new_int(world, 42); - SLV2Value fval = slv2_value_new_float(world, 1.6180); - - TEST_ASSERT(slv2_value_is_uri(uval)); - TEST_ASSERT(slv2_value_is_string(sval)); - TEST_ASSERT(slv2_value_is_int(ival)); - TEST_ASSERT(slv2_value_is_float(fval)); - - TEST_ASSERT(!slv2_value_is_literal(uval)); - TEST_ASSERT(slv2_value_is_literal(sval)); - TEST_ASSERT(slv2_value_is_literal(ival)); - TEST_ASSERT(slv2_value_is_literal(fval)); - - TEST_ASSERT(!strcmp(slv2_value_as_uri(uval), "http://example.org")); - TEST_ASSERT(!strcmp(slv2_value_as_string(sval), "Foo")); - TEST_ASSERT(slv2_value_as_int(ival) == 42); - TEST_ASSERT(fabs(slv2_value_as_float(fval) - 1.6180) < FLT_EPSILON); - - char* tok = slv2_value_get_turtle_token(uval); - TEST_ASSERT(!strcmp(tok, "<http://example.org>")); - free(tok); - tok = slv2_value_get_turtle_token(sval); - TEST_ASSERT(!strcmp(tok, "Foo")); - free(tok); - tok = slv2_value_get_turtle_token(ival); - TEST_ASSERT(!strcmp(tok, "42")); - free(tok); - tok = slv2_value_get_turtle_token(fval); - TEST_ASSERT(!strncmp(tok, "1.6180", 6)); - free(tok); - - SLV2Value uval_e = slv2_value_new_uri(world, "http://example.org"); - SLV2Value sval_e = slv2_value_new_string(world, "Foo"); - SLV2Value ival_e = slv2_value_new_int(world, 42); - SLV2Value fval_e = slv2_value_new_float(world, 1.6180); - SLV2Value uval_ne = slv2_value_new_uri(world, "http://no-example.org"); - SLV2Value sval_ne = slv2_value_new_string(world, "Bar"); - SLV2Value ival_ne = slv2_value_new_int(world, 24); - SLV2Value fval_ne = slv2_value_new_float(world, 3.14159); - - TEST_ASSERT(slv2_value_equals(uval, uval_e)); - TEST_ASSERT(slv2_value_equals(sval, sval_e)); - TEST_ASSERT(slv2_value_equals(ival, ival_e)); - TEST_ASSERT(slv2_value_equals(fval, fval_e)); - - TEST_ASSERT(!slv2_value_equals(uval, uval_ne)); - TEST_ASSERT(!slv2_value_equals(sval, sval_ne)); - TEST_ASSERT(!slv2_value_equals(ival, ival_ne)); - TEST_ASSERT(!slv2_value_equals(fval, fval_ne)); - - TEST_ASSERT(!slv2_value_equals(uval, sval)); - TEST_ASSERT(!slv2_value_equals(sval, ival)); - TEST_ASSERT(!slv2_value_equals(ival, fval)); - - SLV2Value uval_dup = slv2_value_duplicate(uval); - TEST_ASSERT(slv2_value_equals(uval, uval_dup)); - - SLV2Value ifval = slv2_value_new_float(world, 42.0); - TEST_ASSERT(!slv2_value_equals(ival, ifval)); - slv2_value_free(ifval); - - SLV2Value nil = NULL; - TEST_ASSERT(!slv2_value_equals(uval, nil)); - TEST_ASSERT(!slv2_value_equals(nil, uval)); - TEST_ASSERT(slv2_value_equals(nil, nil)); - - SLV2Value nil2 = slv2_value_duplicate(nil); - TEST_ASSERT(slv2_value_equals(nil, nil2)); - - slv2_value_free(uval); - slv2_value_free(sval); - slv2_value_free(ival); - slv2_value_free(fval); - slv2_value_free(uval_e); - slv2_value_free(sval_e); - slv2_value_free(ival_e); - slv2_value_free(fval_e); - slv2_value_free(uval_ne); - slv2_value_free(sval_ne); - slv2_value_free(ival_ne); - slv2_value_free(fval_ne); - slv2_value_free(uval_dup); - slv2_value_free(nil2); - - cleanup_uris(); - return 1; -} - -/*****************************************************************************/ - -static int discovery_plugin_found = 0; - -static void -discovery_verify_plugin(SLV2Plugin plugin) -{ - SLV2Value value = slv2_plugin_get_uri(plugin); - if (slv2_value_equals(value, plugin_uri_value)) { - SLV2Value lib_uri = NULL; - TEST_ASSERT(!slv2_value_equals(value, plugin2_uri_value)); - discovery_plugin_found = 1; - lib_uri = slv2_plugin_get_library_uri(plugin); - TEST_ASSERT(lib_uri); - TEST_ASSERT(slv2_value_is_uri(lib_uri)); - TEST_ASSERT(slv2_value_as_uri(lib_uri)); - TEST_ASSERT(strstr(slv2_value_as_uri(lib_uri), "foo.so")); - TEST_ASSERT(slv2_plugin_verify(plugin)); - } -} - -int -test_discovery() -{ - if (!start_bundle(MANIFEST_PREFIXES - ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", - BUNDLE_PREFIXES - ":plug a lv2:Plugin ;" - PLUGIN_NAME("Test plugin") " ; " - LICENSE_GPL " ; " - "lv2:port [ a lv2:ControlPort ; a lv2:InputPort ;" - " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"bar\" ; ] .")) - return 0; - - init_uris(); - - SLV2Plugins plugins = slv2_world_get_all_plugins(world); - TEST_ASSERT(slv2_plugins_size(plugins) > 0); - - SLV2Plugin explug = slv2_plugins_get_by_uri(plugins, plugin_uri_value); - TEST_ASSERT(explug != NULL); - SLV2Plugin explug2 = slv2_plugins_get_by_uri(plugins, plugin2_uri_value); - TEST_ASSERT(explug2 == NULL); - - if (explug) { - SLV2Value name = slv2_plugin_get_name(explug); - TEST_ASSERT(!strcmp(slv2_value_as_string(name), "Test plugin")); - slv2_value_free(name); - } - - discovery_plugin_found = 0; - for (size_t i = 0; i < slv2_plugins_size(plugins); i++) - discovery_verify_plugin(slv2_plugins_get_at(plugins, i)); - - TEST_ASSERT(discovery_plugin_found); - plugins = NULL; - - TEST_ASSERT(slv2_plugins_get_at(plugins, (unsigned)INT_MAX + 1) == NULL); - - cleanup_uris(); - - return 1; -} - -/*****************************************************************************/ - -int -test_verify() -{ - if (!start_bundle(MANIFEST_PREFIXES - ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", - BUNDLE_PREFIXES - ":plug a lv2:Plugin ; " - PLUGIN_NAME("Test plugin") " ; " - LICENSE_GPL " ; " - "lv2:port [ a lv2:ControlPort ; a lv2:InputPort ;" - " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"bar\" ] .")) - return 0; - - init_uris(); - SLV2Plugins plugins = slv2_world_get_all_plugins(world); - SLV2Plugin explug = slv2_plugins_get_by_uri(plugins, plugin_uri_value); - TEST_ASSERT(explug); - TEST_ASSERT(slv2_plugin_verify(explug)); - cleanup_uris(); - return 1; -} - -/*****************************************************************************/ - -int -test_no_verify() -{ - if (!start_bundle(MANIFEST_PREFIXES - ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", - BUNDLE_PREFIXES - ":plug a lv2:Plugin . ")) - return 0; - - init_uris(); - SLV2Plugins plugins = slv2_world_get_all_plugins(world); - SLV2Plugin explug = slv2_plugins_get_by_uri(plugins, plugin_uri_value); - TEST_ASSERT(explug); - TEST_ASSERT(!slv2_plugin_verify(explug)); - cleanup_uris(); - return 1; -} - -/*****************************************************************************/ - -int -test_classes() -{ - if (!start_bundle(MANIFEST_PREFIXES - ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", - BUNDLE_PREFIXES - ":plug a lv2:Plugin ; a lv2:CompressorPlugin ; " - PLUGIN_NAME("Test plugin") " ; " - LICENSE_GPL " ; " - "lv2:port [ " - " a lv2:ControlPort ; a lv2:InputPort ; " - " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"Foo\" ; " - "] .")) - return 0; - - init_uris(); - SLV2PluginClass plugin = slv2_world_get_plugin_class(world); - SLV2PluginClasses classes = slv2_world_get_plugin_classes(world); - SLV2PluginClasses children = slv2_plugin_class_get_children(plugin); - - TEST_ASSERT(slv2_plugin_class_get_parent_uri(plugin) == NULL); - TEST_ASSERT(slv2_plugin_classes_size(classes) > slv2_plugin_classes_size(children)); - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_plugin_class_get_label(plugin)), "Plugin")); - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_plugin_class_get_uri(plugin)), - "http://lv2plug.in/ns/lv2core#Plugin")); - - for (unsigned i = 0; i < slv2_plugin_classes_size(children); ++i) { - TEST_ASSERT(slv2_value_equals( - slv2_plugin_class_get_parent_uri(slv2_plugin_classes_get_at(children, i)), - slv2_plugin_class_get_uri(plugin))); - } - - SLV2Value some_uri = slv2_value_new_uri(world, "http://example.org/whatever"); - TEST_ASSERT(slv2_plugin_classes_get_by_uri(classes, some_uri) == NULL); - slv2_value_free(some_uri); - - TEST_ASSERT(slv2_plugin_classes_get_at(classes, (unsigned)INT_MAX + 1) == NULL); - - slv2_plugin_classes_free(children); - - cleanup_uris(); - return 1; -} - -/*****************************************************************************/ - -int -test_plugin() -{ - if (!start_bundle(MANIFEST_PREFIXES - ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", - BUNDLE_PREFIXES - ":plug a lv2:Plugin ; a lv2:CompressorPlugin ; " - PLUGIN_NAME("Test plugin") " ; " - LICENSE_GPL " ; " - "lv2:optionalFeature lv2:hardRTCapable ; " - "lv2:requiredFeature <http://lv2plug.in/ns/ext/event> ; " - ":foo 1.6180 ; " - ":bar true ; " - ":baz false ; " - "doap:maintainer [ foaf:name \"David Robillard\" ; " - " foaf:homepage <http://drobilla.net> ; foaf:mbox <mailto:d@drobilla.net> ] ; " - "lv2:port [ " - " a lv2:ControlPort ; a lv2:InputPort ; " - " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"bar\" ; " - " lv2:minimum -1.0 ; lv2:maximum 1.0 ; lv2:default 0.5 " - "] , [ " - " a lv2:ControlPort ; a lv2:InputPort ; " - " lv2:index 1 ; lv2:symbol \"bar\" ; lv2:name \"Baz\" ; " - " lv2:minimum -2.0 ; lv2:maximum 2.0 ; lv2:default 1.0 " - "] , [ " - " a lv2:ControlPort ; a lv2:OutputPort ; " - " lv2:index 2 ; lv2:symbol \"latency\" ; lv2:name \"Latency\" ; " - " lv2:portProperty lv2:reportsLatency " - "] . \n" - ":thing doap:name \"Something else\" .\n")) - return 0; - - init_uris(); - SLV2Plugins plugins = slv2_world_get_all_plugins(world); - SLV2Plugin plug = slv2_plugins_get_by_uri(plugins, plugin_uri_value); - TEST_ASSERT(plug); - - SLV2PluginClass class = slv2_plugin_get_class(plug); - SLV2Value class_uri = slv2_plugin_class_get_uri(class); - TEST_ASSERT(!strcmp(slv2_value_as_string(class_uri), - "http://lv2plug.in/ns/lv2core#CompressorPlugin")); - - SLV2Value plug_bundle_uri = slv2_plugin_get_bundle_uri(plug); - TEST_ASSERT(!strcmp(slv2_value_as_string(plug_bundle_uri), bundle_dir_uri)); - - SLV2Values data_uris = slv2_plugin_get_data_uris(plug); - TEST_ASSERT(slv2_values_size(data_uris) == 2); - - char* manifest_uri = (char*)malloc(TEST_PATH_MAX); - char* data_uri = (char*)malloc(TEST_PATH_MAX); - snprintf(manifest_uri, TEST_PATH_MAX, "%s%s", - slv2_value_as_string(plug_bundle_uri), "manifest.ttl"); - snprintf(data_uri, TEST_PATH_MAX, "%s%s", - slv2_value_as_string(plug_bundle_uri), "plugin.ttl"); - - SLV2Value manifest_uri_val = slv2_value_new_uri(world, manifest_uri); - TEST_ASSERT(slv2_values_contains(data_uris, manifest_uri_val)); - slv2_value_free(manifest_uri_val); - - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_values_get_at(data_uris, 0)), manifest_uri)); - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_values_get_at(data_uris, 1)), data_uri)); - - free(manifest_uri); - free(data_uri); - - float mins[1]; - float maxs[1]; - float defs[1]; - slv2_plugin_get_port_ranges_float(plug, mins, maxs, defs); - TEST_ASSERT(mins[0] == -1.0f); - TEST_ASSERT(maxs[0] == 1.0f); - TEST_ASSERT(defs[0] == 0.5f); - - SLV2Value audio_class = slv2_value_new_uri(world, - "http://lv2plug.in/ns/lv2core#AudioPort"); - SLV2Value control_class = slv2_value_new_uri(world, - "http://lv2plug.in/ns/lv2core#ControlPort"); - SLV2Value in_class = slv2_value_new_uri(world, - "http://lv2plug.in/ns/lv2core#InputPort"); - SLV2Value out_class = slv2_value_new_uri(world, - "http://lv2plug.in/ns/lv2core#OutputPort"); - - TEST_ASSERT(slv2_plugin_get_num_ports_of_class(plug, control_class, NULL) == 3); - TEST_ASSERT(slv2_plugin_get_num_ports_of_class(plug, audio_class, NULL) == 0); - TEST_ASSERT(slv2_plugin_get_num_ports_of_class(plug, in_class, NULL) == 2); - TEST_ASSERT(slv2_plugin_get_num_ports_of_class(plug, out_class, NULL) == 1); - TEST_ASSERT(slv2_plugin_get_num_ports_of_class(plug, control_class, in_class, NULL) == 2); - TEST_ASSERT(slv2_plugin_get_num_ports_of_class(plug, control_class, out_class, NULL) == 1); - TEST_ASSERT(slv2_plugin_get_num_ports_of_class(plug, audio_class, in_class, NULL) == 0); - TEST_ASSERT(slv2_plugin_get_num_ports_of_class(plug, audio_class, out_class, NULL) == 0); - - TEST_ASSERT(slv2_plugin_has_latency(plug)); - TEST_ASSERT(slv2_plugin_get_latency_port_index(plug) == 2); - - SLV2Value rt_feature = slv2_value_new_uri(world, - "http://lv2plug.in/ns/lv2core#hardRTCapable"); - SLV2Value event_feature = slv2_value_new_uri(world, - "http://lv2plug.in/ns/ext/event"); - SLV2Value pretend_feature = slv2_value_new_uri(world, - "http://example.org/solvesWorldHunger"); - - TEST_ASSERT(slv2_plugin_has_feature(plug, rt_feature)); - TEST_ASSERT(slv2_plugin_has_feature(plug, event_feature)); - TEST_ASSERT(!slv2_plugin_has_feature(plug, pretend_feature)); - - slv2_value_free(rt_feature); - slv2_value_free(event_feature); - slv2_value_free(pretend_feature); - - SLV2Values supported = slv2_plugin_get_supported_features(plug); - SLV2Values required = slv2_plugin_get_required_features(plug); - SLV2Values optional = slv2_plugin_get_optional_features(plug); - TEST_ASSERT(slv2_values_size(supported) == 2); - TEST_ASSERT(slv2_values_size(required) == 1); - TEST_ASSERT(slv2_values_size(optional) == 1); - slv2_values_free(supported); - slv2_values_free(required); - slv2_values_free(optional); - - SLV2Value foo_p = slv2_value_new_uri(world, "http://example.org/foo"); - SLV2Values foos = slv2_plugin_get_value(plug, foo_p); - TEST_ASSERT(slv2_values_size(foos) == 1); - TEST_ASSERT(fabs(slv2_value_as_float(slv2_values_get_at(foos, 0)) - 1.6180) < FLT_EPSILON); - slv2_value_free(foo_p); - slv2_values_free(foos); - - SLV2Value bar_p = slv2_value_new_uri(world, "http://example.org/bar"); - SLV2Values bars = slv2_plugin_get_value(plug, bar_p); - TEST_ASSERT(slv2_values_size(bars) == 1); - TEST_ASSERT(slv2_value_as_bool(slv2_values_get_at(bars, 0)) == true); - slv2_value_free(bar_p); - slv2_values_free(bars); - - SLV2Value baz_p = slv2_value_new_uri(world, "http://example.org/baz"); - SLV2Values bazs = slv2_plugin_get_value(plug, baz_p); - TEST_ASSERT(slv2_values_size(bazs) == 1); - TEST_ASSERT(slv2_value_as_bool(slv2_values_get_at(bazs, 0)) == false); - slv2_value_free(baz_p); - slv2_values_free(bazs); - - SLV2Value author_name = slv2_plugin_get_author_name(plug); - TEST_ASSERT(!strcmp(slv2_value_as_string(author_name), "David Robillard")); - slv2_value_free(author_name); - - SLV2Value author_email = slv2_plugin_get_author_email(plug); - TEST_ASSERT(!strcmp(slv2_value_as_string(author_email), "mailto:d@drobilla.net")); - slv2_value_free(author_email); - - SLV2Value author_homepage = slv2_plugin_get_author_homepage(plug); - TEST_ASSERT(!strcmp(slv2_value_as_string(author_homepage), "http://drobilla.net")); - slv2_value_free(author_homepage); - - SLV2Value thing_uri = slv2_value_new_uri(world, "http://example.org/thing"); - SLV2Value name_p = slv2_value_new_uri(world, "http://usefulinc.com/ns/doap#name"); - SLV2Values thing_names = slv2_plugin_get_value_for_subject(plug, thing_uri, name_p); - TEST_ASSERT(slv2_values_size(thing_names) == 1); - SLV2Value thing_name = slv2_values_get_at(thing_names, 0); - TEST_ASSERT(thing_name); - TEST_ASSERT(slv2_value_is_string(thing_name)); - TEST_ASSERT(!strcmp(slv2_value_as_string(thing_name), "Something else")); - - SLV2UIs uis = slv2_plugin_get_uis(plug); - TEST_ASSERT(slv2_uis_size(uis) == 0); - slv2_uis_free(uis); - - slv2_values_free(thing_names); - slv2_value_free(thing_uri); - slv2_value_free(name_p); - slv2_value_free(control_class); - slv2_value_free(audio_class); - slv2_value_free(in_class); - slv2_value_free(out_class); - cleanup_uris(); - return 1; -} - -/*****************************************************************************/ - -int -test_port() -{ - if (!start_bundle(MANIFEST_PREFIXES - ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", - BUNDLE_PREFIXES PREFIX_LV2EV - ":plug a lv2:Plugin ; " - PLUGIN_NAME("Test plugin") " ; " - LICENSE_GPL " ; " - "doap:homepage <http://example.org/someplug> ; " - "lv2:port [ " - " a lv2:ControlPort ; a lv2:InputPort ; " - " lv2:index 0 ; lv2:symbol \"foo\" ; " - " lv2:name \"store\" ; " - " lv2:name \"dépanneur\"@fr-ca ; lv2:name \"épicerie\"@fr-fr ; " - " lv2:name \"tienda\"@es ; " - " lv2:portProperty lv2:integer ; " - " lv2:minimum -1.0 ; lv2:maximum 1.0 ; lv2:default 0.5 ; " - " lv2:scalePoint [ rdfs:label \"Sin\"; rdf:value 3 ] ; " - " lv2:scalePoint [ rdfs:label \"Cos\"; rdf:value 4 ] " - "] , [\n" - " a lv2:EventPort ; a lv2:InputPort ; " - " lv2:index 1 ; lv2:symbol \"event_in\" ; " - " lv2:name \"Event Input\" ; " - " lv2ev:supportsEvent <http://example.org/event> " - "] .")) - return 0; - - init_uris(); - SLV2Plugins plugins = slv2_world_get_all_plugins(world); - SLV2Plugin plug = slv2_plugins_get_by_uri(plugins, plugin_uri_value); - TEST_ASSERT(plug); - - SLV2Value psym = slv2_value_new_string(world, "foo"); - SLV2Port p = slv2_plugin_get_port_by_index(plug, 0); - SLV2Port p2 = slv2_plugin_get_port_by_symbol(plug, psym); - slv2_value_free(psym); - TEST_ASSERT(p != NULL); - TEST_ASSERT(p2 != NULL); - TEST_ASSERT(p == p2); - - SLV2Value nopsym = slv2_value_new_string(world, "thisaintnoportfoo"); - SLV2Port p3 = slv2_plugin_get_port_by_symbol(plug, nopsym); - TEST_ASSERT(p3 == NULL); - slv2_value_free(nopsym); - - SLV2Value audio_class = slv2_value_new_uri(world, - "http://lv2plug.in/ns/lv2core#AudioPort"); - SLV2Value control_class = slv2_value_new_uri(world, - "http://lv2plug.in/ns/lv2core#ControlPort"); - SLV2Value in_class = slv2_value_new_uri(world, - "http://lv2plug.in/ns/lv2core#InputPort"); - - TEST_ASSERT(slv2_values_size(slv2_port_get_classes(plug, p)) == 2); - TEST_ASSERT(slv2_plugin_get_num_ports(plug) == 2); - TEST_ASSERT(slv2_values_get_at(slv2_port_get_classes(plug, p), (unsigned)INT_MAX+1) == NULL); - TEST_ASSERT(slv2_port_is_a(plug, p, control_class)); - TEST_ASSERT(slv2_port_is_a(plug, p, in_class)); - TEST_ASSERT(!slv2_port_is_a(plug, p, audio_class)); - - SLV2Values port_properties = slv2_port_get_properties(plug, p); - TEST_ASSERT(slv2_values_size(port_properties) == 1); - slv2_values_free(port_properties); - - // Untranslated name (current locale is set to "C" in main) - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_port_get_symbol(plug, p)), "foo")); - SLV2Value name = slv2_port_get_name(plug, p); - TEST_ASSERT(!strcmp(slv2_value_as_string(name), "store")); - slv2_value_free(name); - - // Exact language match - setenv("LANG", "fr_FR", 1); - name = slv2_port_get_name(plug, p); - TEST_ASSERT(!strcmp(slv2_value_as_string(name), "épicerie")); - slv2_value_free(name); - - // Exact language match (with charset suffix) - setenv("LANG", "fr_CA.utf8", 1); - name = slv2_port_get_name(plug, p); - TEST_ASSERT(!strcmp(slv2_value_as_string(name), "dépanneur")); - slv2_value_free(name); - - // Partial language match (choose value translated for different country) - setenv("LANG", "fr_BE", 1); - name = slv2_port_get_name(plug, p); - TEST_ASSERT((!strcmp(slv2_value_as_string(name), "dépanneur")) - ||(!strcmp(slv2_value_as_string(name), "épicerie"))); - slv2_value_free(name); - - // Partial language match (choose country-less language tagged value) - setenv("LANG", "es_MX", 1); - name = slv2_port_get_name(plug, p); - TEST_ASSERT(!strcmp(slv2_value_as_string(name), "tienda")); - slv2_value_free(name); - - setenv("LANG", "C", 1); // Reset locale - - SLV2ScalePoints points = slv2_port_get_scale_points(plug, p); - TEST_ASSERT(slv2_scale_points_size(points) == 2); - - TEST_ASSERT(slv2_scale_points_get_at(points, (unsigned)INT_MAX+1) == NULL); - TEST_ASSERT(slv2_scale_points_get_at(points, 2) == NULL); - SLV2ScalePoint sp0 = slv2_scale_points_get_at(points, 0); - TEST_ASSERT(sp0); - SLV2ScalePoint sp1 = slv2_scale_points_get_at(points, 1); - TEST_ASSERT(sp1); - - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_scale_point_get_label(sp0)), "Sin")); - TEST_ASSERT(slv2_value_as_float(slv2_scale_point_get_value(sp0)) == 3); - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_scale_point_get_label(sp1)), "Cos")); - TEST_ASSERT(slv2_value_as_float(slv2_scale_point_get_value(sp1)) == 4); - - SLV2Value homepage_p = slv2_value_new_uri(world, "http://usefulinc.com/ns/doap#homepage"); - SLV2Values homepages = slv2_plugin_get_value(plug, homepage_p); - TEST_ASSERT(slv2_values_size(homepages) == 1); - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_values_get_at(homepages, 0)), - "http://example.org/someplug")); - - SLV2Value min, max, def; - slv2_port_get_range(plug, p, &def, &min, &max); - TEST_ASSERT(def); - TEST_ASSERT(min); - TEST_ASSERT(max); - TEST_ASSERT(slv2_value_as_float(def) == 0.5); - TEST_ASSERT(slv2_value_as_float(min) == -1.0); - TEST_ASSERT(slv2_value_as_float(max) == 1.0); - - SLV2Value integer_prop = slv2_value_new_uri(world, "http://lv2plug.in/ns/lv2core#integer"); - SLV2Value toggled_prop = slv2_value_new_uri(world, "http://lv2plug.in/ns/lv2core#toggled"); - - TEST_ASSERT(slv2_port_has_property(plug, p, integer_prop)); - TEST_ASSERT(!slv2_port_has_property(plug, p, toggled_prop)); - - SLV2Port ep = slv2_plugin_get_port_by_index(plug, 1); - - SLV2Value event_type = slv2_value_new_uri(world, "http://example.org/event"); - SLV2Value event_type_2 = slv2_value_new_uri(world, "http://example.org/otherEvent"); - TEST_ASSERT(slv2_port_supports_event(plug, ep, event_type)); - TEST_ASSERT(!slv2_port_supports_event(plug, ep, event_type_2)); - - SLV2Value name_p = slv2_value_new_uri(world, "http://lv2plug.in/ns/lv2core#name"); - SLV2Values names = slv2_port_get_value(plug, p, name_p); - TEST_ASSERT(slv2_values_size(names) == 1); - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_values_get_at(names, 0)), - "store")); - slv2_values_free(names); - - SLV2Value true_val = slv2_value_new_bool(world, true); - SLV2Value false_val = slv2_value_new_bool(world, false); - - slv2_world_set_option(world, SLV2_OPTION_FILTER_LANG, false_val); - names = slv2_port_get_value(plug, p, name_p); - TEST_ASSERT(slv2_values_size(names) == 4); - slv2_values_free(names); - slv2_world_set_option(world, SLV2_OPTION_FILTER_LANG, true_val); - - slv2_value_free(false_val); - slv2_value_free(true_val); - - names = slv2_port_get_value(plug, ep, name_p); - TEST_ASSERT(slv2_values_size(names) == 1); - TEST_ASSERT(!strcmp(slv2_value_as_string(slv2_values_get_at(names, 0)), - "Event Input")); - slv2_values_free(names); - slv2_value_free(name_p); - - slv2_value_free(integer_prop); - slv2_value_free(toggled_prop); - slv2_value_free(event_type); - slv2_value_free(event_type_2); - - slv2_value_free(min); - slv2_value_free(max); - slv2_value_free(def); - - slv2_value_free(homepage_p); - slv2_values_free(homepages); - - slv2_scale_points_free(points); - slv2_value_free(control_class); - slv2_value_free(audio_class); - slv2_value_free(in_class); - cleanup_uris(); - return 1; -} - -/*****************************************************************************/ - -int -test_ui() -{ - if (!start_bundle(MANIFEST_PREFIXES - ":plug a lv2:Plugin ; lv2:binary <foo.so> ; rdfs:seeAlso <plugin.ttl> .\n", - BUNDLE_PREFIXES PREFIX_LV2UI - ":plug a lv2:Plugin ; a lv2:CompressorPlugin ; " - PLUGIN_NAME("Test plugin") " ; " - LICENSE_GPL " ; " - "lv2:optionalFeature lv2:hardRTCapable ; " - "lv2:requiredFeature <http://lv2plug.in/ns/ext/event> ; " - "lv2ui:ui :ui , :ui2 , :ui3 , :ui4 ; " - "doap:maintainer [ foaf:name \"David Robillard\" ; " - " foaf:homepage <http://drobilla.net> ; foaf:mbox <mailto:d@drobilla.net> ] ; " - "lv2:port [ " - " a lv2:ControlPort ; a lv2:InputPort ; " - " lv2:index 0 ; lv2:symbol \"foo\" ; lv2:name \"bar\" ; " - " lv2:minimum -1.0 ; lv2:maximum 1.0 ; lv2:default 0.5 " - "] , [ " - " a lv2:ControlPort ; a lv2:InputPort ; " - " lv2:index 1 ; lv2:symbol \"bar\" ; lv2:name \"Baz\" ; " - " lv2:minimum -2.0 ; lv2:maximum 2.0 ; lv2:default 1.0 " - "] , [ " - " a lv2:ControlPort ; a lv2:OutputPort ; " - " lv2:index 2 ; lv2:symbol \"latency\" ; lv2:name \"Latency\" ; " - " lv2:portProperty lv2:reportsLatency " - "] .\n" - ":ui a lv2ui:GtkUI ; " - " lv2ui:requiredFeature lv2ui:makeResident ; " - " lv2ui:binary <ui.so> ; " - " lv2ui:optionalFeature lv2ui:ext_presets . " - ":ui2 a lv2ui:GtkUI ; lv2ui:binary <ui2.so> . " - ":ui3 a lv2ui:GtkUI ; lv2ui:binary <ui3.so> . " - ":ui4 a lv2ui:GtkUI ; lv2ui:binary <ui4.so> . ")) - return 0; - - init_uris(); - SLV2Plugins plugins = slv2_world_get_all_plugins(world); - SLV2Plugin plug = slv2_plugins_get_by_uri(plugins, plugin_uri_value); - TEST_ASSERT(plug); - - SLV2UIs uis = slv2_plugin_get_uis(plug); - TEST_ASSERT(slv2_uis_size(uis) == 4); - - TEST_ASSERT(slv2_uis_get_at(uis, (unsigned)INT_MAX + 1) == NULL); - - SLV2UI ui0 = slv2_uis_get_at(uis, 0); - TEST_ASSERT(ui0); - - SLV2Value ui_uri = slv2_value_new_uri(world, "http://example.org/ui"); - SLV2Value ui2_uri = slv2_value_new_uri(world, "http://example.org/ui3"); - SLV2Value ui3_uri = slv2_value_new_uri(world, "http://example.org/ui4"); - SLV2Value noui_uri = slv2_value_new_uri(world, "http://example.org/notaui"); - - SLV2UI ui0_2 = slv2_uis_get_by_uri(uis, ui_uri); - TEST_ASSERT(ui0 == ui0_2); - - SLV2UI ui2 = slv2_uis_get_by_uri(uis, ui2_uri); - TEST_ASSERT(ui2 != ui0); - - SLV2UI ui3 = slv2_uis_get_by_uri(uis, ui3_uri); - TEST_ASSERT(ui3 != ui0); - - SLV2UI noui = slv2_uis_get_by_uri(uis, noui_uri); - TEST_ASSERT(noui == NULL); - - SLV2Values classes = slv2_ui_get_classes(ui0); - TEST_ASSERT(slv2_values_size(classes) == 1); - - SLV2Value ui_class_uri = slv2_value_new_uri(world, - "http://lv2plug.in/ns/extensions/ui#GtkUI"); - - TEST_ASSERT(slv2_value_equals(slv2_values_get_at(classes, 0), ui_class_uri)); - TEST_ASSERT(slv2_ui_is_a(ui0, ui_class_uri)); - - SLV2Value plug_bundle_uri = slv2_plugin_get_bundle_uri(plug); - SLV2Value ui_bundle_uri = slv2_ui_get_bundle_uri(ui0); - TEST_ASSERT(slv2_value_equals(plug_bundle_uri, ui_bundle_uri)); - - char* ui_binary_uri_str = (char*)malloc(TEST_PATH_MAX); - snprintf(ui_binary_uri_str, TEST_PATH_MAX, "%s%s", - slv2_value_as_string(plug_bundle_uri), "ui.so"); - - SLV2Value ui_binary_uri = slv2_ui_get_binary_uri(ui0); - - SLV2Value expected_uri = slv2_value_new_uri(world, ui_binary_uri_str); - TEST_ASSERT(slv2_value_equals(expected_uri, ui_binary_uri)); - - free(ui_binary_uri_str); - slv2_value_free(ui_class_uri); - slv2_value_free(ui_uri); - slv2_value_free(ui2_uri); - slv2_value_free(ui3_uri); - slv2_value_free(noui_uri); - slv2_value_free(expected_uri); - slv2_uis_free(uis); - - cleanup_uris(); - return 1; -} - -/*****************************************************************************/ - -/* add tests here */ -static struct TestCase tests[] = { - TEST_CASE(utils), - TEST_CASE(value), - TEST_CASE(verify), - TEST_CASE(no_verify), - TEST_CASE(discovery), - TEST_CASE(classes), - TEST_CASE(plugin), - TEST_CASE(port), - TEST_CASE(ui), - { NULL, NULL } -}; - -void -run_tests() -{ - int i; - for (i = 0; tests[i].title; i++) { - printf("*** Test %s\n", tests[i].title); - if (!tests[i].func()) { - printf("\nTest failed\n"); - /* test case that wasn't able to be executed at all counts as 1 test + 1 error */ - error_count++; - test_count++; - } - unload_bundle(); - cleanup(); - } -} - -int -main(int argc, char *argv[]) -{ - if (argc != 1) { - printf("Syntax: %s\n", argv[0]); - return 0; - } - setenv("LANG", "C", 1); - init_tests(); - run_tests(); - cleanup(); - printf("\n*** Test Results: %d tests, %d errors\n\n", test_count, error_count); - return error_count ? 1 : 0; -} |