summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJorn Baayen <jorn@openedhand.com>2008-01-06 21:07:40 +0000
committerJorn Baayen <jorn@openedhand.com>2008-01-06 21:07:40 +0000
commit97e5ff2b9bbc41449d430913e2360e8087719c95 (patch)
tree1ef8eca9ac6c60ec9bef90faf418b65bf60a86af /tests
parent8adf1586ceca091469105426288d78ba43443b21 (diff)
downloadgupnp-av-97e5ff2b9bbc41449d430913e2360e8087719c95.tar.gz
2008-01-06 Jorn Baayen <jorn@openedhand.com>
* Makefile.am: * configure.ac: * libgupnp-av/Makefile.am: * libgupnp-av/gupnp-av-search-criteria-scanner.c: * libgupnp-av/gupnp-av-search-criteria-scanner.h: * libgupnp-av/gupnp-av.h: * tests/Makefile.am: * tests/test-search-criteria-scanner.c: Add initial search criteria parsing code. git-svn-id: https://svn.o-hand.com/repos/gupnp/trunk/gupnp-av@661 d8cb91d7-bff9-0310-92b9-80b65e4482b2
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am6
-rw-r--r--tests/test-search-criteria-scanner.c202
2 files changed, 208 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..3fdb754
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,6 @@
+AM_CFLAGS = $(LIBGUPNP_CFLAGS) -I$(top_srcdir)
+
+noinst_PROGRAMS = test-search-criteria-scanner
+
+test_search_criteria_scanner_SOURCES = test-search-criteria-scanner.c
+test_search_criteria_scanner_LDADD = $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la
diff --git a/tests/test-search-criteria-scanner.c b/tests/test-search-criteria-scanner.c
new file mode 100644
index 0000000..9c546fc
--- /dev/null
+++ b/tests/test-search-criteria-scanner.c
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2007 OpenedHand Ltd
+ *
+ * Authors: Jorn Baayen <jorn@openedhand.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+
+#include <libgupnp-av/gupnp-av-search-criteria-scanner.h>
+
+/* XXX operator precedence */
+
+static gboolean
+scan_rel_exp (GScanner *scanner)
+{
+ GTokenValue value;
+ gboolean ret;
+ guint token;
+ char *arg1, *arg2;
+
+ token = g_scanner_get_next_token (scanner);
+ g_assert (token == G_TOKEN_IDENTIFIER); /* Already checked */
+
+ value = g_scanner_cur_value (scanner);
+ arg1 = g_strdup (value.v_string);
+
+ token = g_scanner_get_next_token (scanner);
+ switch (token) {
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_EQ:
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_NEQ:
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_LESS:
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_LEQ:
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_GREATER:
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_GEQ:
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_CONTAINS:
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_DOES_NOT_CONTAIN:
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_DERIVED_FROM:
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING) {
+ g_scanner_unexp_token (scanner,
+ G_TOKEN_STRING,
+ NULL, NULL, NULL,
+ NULL, FALSE);
+
+ ret = FALSE;
+ }
+
+ value = g_scanner_cur_value (scanner);
+ arg2 = value.v_string;
+
+ ret = TRUE;
+
+ break;
+
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_EXISTS:
+ token = g_scanner_get_next_token (scanner);
+ switch (token) {
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_TRUE:
+ ret = TRUE;
+
+ break;
+
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_FALSE:
+ ret = TRUE;
+
+ break;
+
+ default:
+ g_scanner_unexp_token (scanner,
+ G_TOKEN_IDENTIFIER,
+ NULL, NULL, NULL,
+ "Expected boolean value",
+ FALSE);
+
+ ret = FALSE;
+ }
+
+ break;
+
+ default:
+ g_scanner_unexp_token (scanner,
+ G_TOKEN_IDENTIFIER,
+ NULL, NULL, NULL,
+ "Expected operator",
+ FALSE);
+
+ ret = FALSE;
+ }
+
+ g_free (arg1);
+
+ return ret;
+}
+
+static gboolean
+scan_search_exp (GScanner *scanner)
+{
+ gboolean ret;
+ guint token;
+
+ token = g_scanner_peek_next_token (scanner);
+ switch (token) {
+ case G_TOKEN_LEFT_PAREN:
+ g_scanner_get_next_token (scanner);
+
+ ret = scan_search_exp (scanner);
+ if (ret == FALSE)
+ break;
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_RIGHT_PAREN) {
+ g_scanner_unexp_token (scanner,
+ G_TOKEN_RIGHT_PAREN,
+ NULL, NULL, NULL, NULL, FALSE);
+
+ ret = FALSE;
+ }
+
+ break;
+
+ case G_TOKEN_IDENTIFIER:
+ ret = scan_rel_exp (scanner);
+ if (ret == FALSE)
+ break;
+
+ token = g_scanner_peek_next_token (scanner);
+
+ switch (token) {
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_AND:
+ case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_OR:
+ g_scanner_get_next_token (scanner);
+ ret = scan_search_exp (scanner);
+ break;
+
+ default:
+ break;
+ }
+
+ break;
+
+ default:
+ g_scanner_get_next_token (scanner);
+
+ g_scanner_unexp_token (scanner,
+ G_TOKEN_IDENTIFIER,
+ NULL, NULL, NULL, NULL, FALSE);
+
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+int
+main (int argc, char **argv)
+{
+ GScanner *scanner;
+ gboolean ret;
+ guint token;
+
+ g_assert (argc == 2);
+
+ scanner = gupnp_av_search_criteria_scanner_new ();
+
+ g_scanner_input_text (scanner, argv[1], strlen (argv[1]));
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == GUPNP_AV_SEARCH_CRITERIA_SYMBOL_ASTERISK) {
+ g_scanner_get_next_token (scanner);
+
+ ret = TRUE;
+ } else
+ ret = scan_search_exp (scanner);
+
+ if (ret == TRUE) {
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_EOF) {
+ g_scanner_unexp_token (scanner,
+ G_TOKEN_EOF,
+ NULL, NULL, NULL, NULL, FALSE);
+ }
+ }
+
+ g_scanner_destroy (scanner);
+
+ return 0;
+}