summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Pabón <lpabon@redhat.com>2015-02-07 18:18:12 +0100
committerAndreas Schneider <asn@cryptomilk.org>2015-02-09 09:23:01 +0100
commit236ed5c00ab215eb7382b6d908cd3fe589bffebc (patch)
treec9f23c5fdd6a1cc8c890b65c43796bbf6faca823
parent8bfb195065bc9e4d71c663bf874fc8d8c81a4cd0 (diff)
downloadcmocka-236ed5c00ab215eb7382b6d908cd3fe589bffebc.zip
cmocka-236ed5c00ab215eb7382b6d908cd3fe589bffebc.tar.gz
cmocka-236ed5c00ab215eb7382b6d908cd3fe589bffebc.tar.bz2
include: Add Programming by Contract header.
Signed-off-by: Luis Pabón <lpabon@redhat.com>
-rw-r--r--include/CMakeLists.txt1
-rw-r--r--include/cmocka_pbc.h62
2 files changed, 63 insertions, 0 deletions
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index 9172633..18de8da 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -2,6 +2,7 @@ project(cmocka-headers C)
set(cmocka_HDRS
cmocka.h
+ cmocka_pbc.h
)
install(
diff --git a/include/cmocka_pbc.h b/include/cmocka_pbc.h
new file mode 100644
index 0000000..a2a1bc1
--- /dev/null
+++ b/include/cmocka_pbc.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2014 Luis Pabon, Jr.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Programming by Contract is a programming methodology
+ * which binds the caller and the function called to a
+ * contract. The contract is represented using Hoare Triple:
+ * {P} C {Q}
+ * where {P} is the precondition before executing command C,
+ * and {Q} is the postcondition.
+ *
+ * See also:
+ * http://en.wikipedia.org/wiki/Design_by_contract
+ * http://en.wikipedia.org/wiki/Hoare_logic
+ * http://dlang.org/dbc.html
+ */
+#ifndef CMOCKA_PBC_H_
+#define CMOCKA_PBC_H_
+
+#if defined(UNIT_TESTING) || defined (DEBUG)
+
+#include <assert.h>
+
+/*
+ * Checks caller responsibility against contract
+ */
+#define REQUIRE(cond) assert(cond)
+
+/*
+ * Checks function reponsability against contract.
+ */
+#define ENSURE(cond) assert(cond)
+
+/*
+ * While REQUIRE and ENSURE apply to functions, INVARIANT
+ * applies to classes/structs. It ensures that intances
+ * of the class/struct are consistent. In other words,
+ * that the instance has not been corrupted.
+ */
+#define INVARIANT(invariant_fnc) do{ (invariant_fnc) } while (0);
+
+#else
+#define REQUIRE(cond) do { } while (0);
+#define ENSURE(cond) do { } while (0);
+#define INVARIANT(invariant_fnc) do{ } while (0);
+
+#endif /* defined(UNIT_TESTING) || defined (DEBUG) */
+#endif /* CMOCKA_PBC_H_ */
+