diff --git a/tests/data/small-client-core.h b/tests/data/small-client-core.h
index 0e722441..03f889c8 100644
--- a/tests/data/small-client-core.h
+++ b/tests/data/small-client-core.h
@@ -106,6 +106,29 @@ enum intf_A_foo {
#define INTF_A_FOO_DEPRECATED_SINCE_VERSION 2
#endif /* INTF_A_FOO_ENUM */
+#ifndef INTF_A_BAR_ENUM
+#define INTF_A_BAR_ENUM
+enum intf_A_bar {
+ /**
+ * this is the first
+ */
+ INTF_A_BAR_FIRST = 0x01,
+ /**
+ * this is the second
+ */
+ INTF_A_BAR_SECOND = 0x02,
+ /**
+ * this is the third
+ * @since 2
+ */
+ INTF_A_BAR_THIRD = 0x04,
+};
+/**
+ * @ingroup iface_intf_A
+ */
+#define INTF_A_BAR_THIRD_SINCE_VERSION 2
+#endif /* INTF_A_BAR_ENUM */
+
/**
* @ingroup iface_intf_A
* @struct intf_A_listener
diff --git a/tests/data/small-client.h b/tests/data/small-client.h
index ad435923..0d5b6055 100644
--- a/tests/data/small-client.h
+++ b/tests/data/small-client.h
@@ -106,6 +106,29 @@ enum intf_A_foo {
#define INTF_A_FOO_DEPRECATED_SINCE_VERSION 2
#endif /* INTF_A_FOO_ENUM */
+#ifndef INTF_A_BAR_ENUM
+#define INTF_A_BAR_ENUM
+enum intf_A_bar {
+ /**
+ * this is the first
+ */
+ INTF_A_BAR_FIRST = 0x01,
+ /**
+ * this is the second
+ */
+ INTF_A_BAR_SECOND = 0x02,
+ /**
+ * this is the third
+ * @since 2
+ */
+ INTF_A_BAR_THIRD = 0x04,
+};
+/**
+ * @ingroup iface_intf_A
+ */
+#define INTF_A_BAR_THIRD_SINCE_VERSION 2
+#endif /* INTF_A_BAR_ENUM */
+
/**
* @ingroup iface_intf_A
* @struct intf_A_listener
diff --git a/tests/data/small-server-core.h b/tests/data/small-server-core.h
index e696cde7..d4476959 100644
--- a/tests/data/small-server-core.h
+++ b/tests/data/small-server-core.h
@@ -133,6 +133,47 @@ intf_A_foo_is_valid(uint32_t value, uint32_t version) {
}
#endif /* INTF_A_FOO_ENUM */
+#ifndef INTF_A_BAR_ENUM
+#define INTF_A_BAR_ENUM
+enum intf_A_bar {
+ /**
+ * this is the first
+ */
+ INTF_A_BAR_FIRST = 0x01,
+ /**
+ * this is the second
+ */
+ INTF_A_BAR_SECOND = 0x02,
+ /**
+ * this is the third
+ * @since 2
+ */
+ INTF_A_BAR_THIRD = 0x04,
+};
+/**
+ * @ingroup iface_intf_A
+ */
+#define INTF_A_BAR_THIRD_SINCE_VERSION 2
+/**
+ * @ingroup iface_intf_A
+ * Validate a intf_A bar value.
+ *
+ * @return true on success, false on error.
+ * @ref intf_A_bar
+ */
+static inline bool
+intf_A_bar_is_valid(uint32_t value, uint32_t version) {
+ uint32_t valid = 0;
+ if (version >= 1)
+ valid |= INTF_A_BAR_FIRST;
+ if (version >= 1)
+ valid |= INTF_A_BAR_SECOND;
+ if (version >= 2)
+ valid |= INTF_A_BAR_THIRD;
+ return (value & ~valid) == 0;
+}
+#endif /* INTF_A_BAR_ENUM */
+
/**
* @ingroup iface_intf_A
* @struct intf_A_interface
diff --git a/tests/data/small-server.h b/tests/data/small-server.h
index 009d9cdd..9cafcd93 100644
--- a/tests/data/small-server.h
+++ b/tests/data/small-server.h
@@ -133,6 +133,47 @@ intf_A_foo_is_valid(uint32_t value, uint32_t version) {
}
#endif /* INTF_A_FOO_ENUM */
+#ifndef INTF_A_BAR_ENUM
+#define INTF_A_BAR_ENUM
+enum intf_A_bar {
+ /**
+ * this is the first
+ */
+ INTF_A_BAR_FIRST = 0x01,
+ /**
+ * this is the second
+ */
+ INTF_A_BAR_SECOND = 0x02,
+ /**
+ * this is the third
+ * @since 2
+ */
+ INTF_A_BAR_THIRD = 0x04,
+};
+/**
+ * @ingroup iface_intf_A
+ */
+#define INTF_A_BAR_THIRD_SINCE_VERSION 2
+/**
+ * @ingroup iface_intf_A
+ * Validate a intf_A bar value.
+ *
+ * @return true on success, false on error.
+ * @ref intf_A_bar
+ */
+static inline bool
+intf_A_bar_is_valid(uint32_t value, uint32_t version) {
+ uint32_t valid = 0;
+ if (version >= 1)
+ valid |= INTF_A_BAR_FIRST;
+ if (version >= 1)
+ valid |= INTF_A_BAR_SECOND;
+ if (version >= 2)
+ valid |= INTF_A_BAR_THIRD;
+ return (value & ~valid) == 0;
+}
+#endif /* INTF_A_BAR_ENUM */
+
/**
* @ingroup iface_intf_A
* @struct intf_A_interface
diff --git a/tests/data/small.xml b/tests/data/small.xml
index ac527795..ab297490 100644
--- a/tests/data/small.xml
+++ b/tests/data/small.xml
@@ -58,5 +58,12 @@
+
+
+
+
+
+
+
diff --git a/tests/enum-validator-test.c b/tests/enum-validator-test.c
index 92037cff..8fb05b43 100644
--- a/tests/enum-validator-test.c
+++ b/tests/enum-validator-test.c
@@ -10,4 +10,19 @@ main(int argc, char *argv[]) {
assert(intf_A_foo_is_valid(INTF_A_FOO_THIRD, 2));
assert(intf_A_foo_is_valid(INTF_A_FOO_NEGATIVE, 2));
+
+ assert(intf_A_bar_is_valid(INTF_A_BAR_FIRST, 1));
+ assert(intf_A_bar_is_valid(INTF_A_BAR_FIRST, 2));
+ assert(intf_A_bar_is_valid(INTF_A_BAR_SECOND, 1));
+ assert(intf_A_bar_is_valid(INTF_A_BAR_SECOND, 2));
+ assert(intf_A_bar_is_valid(INTF_A_BAR_FIRST | INTF_A_BAR_SECOND, 1));
+ assert(intf_A_bar_is_valid(INTF_A_BAR_FIRST | INTF_A_BAR_SECOND, 2));
+
+ assert(!intf_A_bar_is_valid(INTF_A_BAR_THIRD, 1));
+ assert(!intf_A_bar_is_valid(INTF_A_BAR_FIRST | INTF_A_BAR_THIRD, 1));
+ assert(intf_A_bar_is_valid(INTF_A_BAR_THIRD, 2));
+ assert(intf_A_bar_is_valid(INTF_A_BAR_FIRST | INTF_A_BAR_THIRD, 2));
+
+ assert(!intf_A_bar_is_valid(0xFF, 1));
+ assert(!intf_A_bar_is_valid(0xFF, 2));
}