You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by to...@apache.org on 2015/09/11 18:13:57 UTC

[2/3] couchdb-mango git commit: Use hypothesis instead of random values for num_string tests

Use hypothesis instead of random values for num_string tests

COUCHDB-2787


Project: http://git-wip-us.apache.org/repos/asf/couchdb-mango/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-mango/commit/2793b9f5
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-mango/tree/2793b9f5
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-mango/diff/2793b9f5

Branch: refs/heads/master
Commit: 2793b9f50561dd4d9a271ce66aad29d7bfbad942
Parents: ba961dc
Author: Tony Sun <to...@cloudant.com>
Authored: Wed Sep 9 15:10:21 2015 -0700
Committer: Tony Sun <to...@cloudant.com>
Committed: Wed Sep 9 15:13:37 2015 -0700

----------------------------------------------------------------------
 test/06-basic-text-test.py | 60 ++++++++++++++++++++++++++++-------------
 test/README.md             |  1 +
 test/literal_gen.py        | 49 ---------------------------------
 test/num_string_docs.py    | 49 ---------------------------------
 4 files changed, 43 insertions(+), 116 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/2793b9f5/test/06-basic-text-test.py
----------------------------------------------------------------------
diff --git a/test/06-basic-text-test.py b/test/06-basic-text-test.py
index 4024042..53e9159 100644
--- a/test/06-basic-text-test.py
+++ b/test/06-basic-text-test.py
@@ -14,7 +14,10 @@ import json
 import mango
 import unittest
 import user_docs
+import copy
 import num_string_docs
+from hypothesis import given, assume
+import hypothesis.strategies as st
 
 @unittest.skipIf(mango.has_text_service(), "text service exists")
 class TextIndexCheckTests(mango.DbPerClass):
@@ -556,30 +559,51 @@ class ElemMatchTests(mango.FriendDocsTextTests):
 
 # Test numeric strings for $text
 @unittest.skipUnless(mango.has_text_service(), "requires text service")
-class NumStringTests(mango.NumStringDocsTextTests):
+class NumStringTests(mango.DbPerClass):
 
-    def test_floating_point_val(self):
-        float_point_string = num_string_docs.DOCS[2]["number_string"]
-        q = {"$text": float_point_string}
-        docs = self.db.find(q)
-        assert len(docs) == 1
-        assert docs[0]["number_string"] == float_point_string
-
-    def test_hex_floating_point_val(self):
-        hex_float_point_string = num_string_docs.DOCS[3]["number_string"]
-        q = {"$text": hex_float_point_string}
-        docs = self.db.find(q)
-        assert len(docs) == 1
-        assert docs[0]["number_string"] == hex_float_point_string
+    @classmethod
+    def setUpClass(klass):
+        super(NumStringTests, klass).setUpClass()
+        klass.db.recreate()
+        klass.db.create_text_index()
 
     def test_nan_val(self):
+        doc = {"number_NaN": "NaN"}
+        self.db.save_doc(doc)
         q = {"$text": "NaN"}
         docs = self.db.find(q)
-        assert len(docs) == 1
-        assert docs[0]["number_string"] == "NaN"
+        print docs
+        assert docs[0]["number_NaN"] == "NaN"
 
     def test_infinity_val(self):
+        doc = {"number_Infinity": "Infinity"}
+        self.db.save_doc(doc)
         q = {"$text": "Infinity"}
         docs = self.db.find(q)
-        assert len(docs) == 1
-        assert docs[0]["number_string"] == "Infinity"
+        assert docs[0]["number_Infinity"] == "Infinity"
+
+    @given(float_point_string=st.floats().map(str))
+    def test_floating_point_val(self,float_point_string):
+        assume(float_point_string!="nan")
+        doc = {"number_string": float_point_string}
+        self.db.save_doc(doc)
+        q = {"$text": float_point_string}
+        docs = self.db.find(q)
+        if len(docs) == 1:
+            assert docs[0]["number_string"] == float_point_string
+        if len(docs) == 2:
+            if docs[0]["number_string"] != float_point_string:
+                assert docs[1]["number_string"] == float_point_string
+
+    @given(f=st.floats())
+    def test_floating_point_val(self,f):
+        hex_float_point_string = f.hex()
+        doc = {"number_string": hex_float_point_string}
+        self.db.save_doc(doc)
+        q = {"$text": hex_float_point_string}
+        docs = self.db.find(q)
+        if len(docs) == 1:
+            assert docs[0]["number_string"] == hex_float_point_string
+        if len(docs) == 2:
+            if docs[0]["number_string"] != hex_float_point_string:
+                assert docs[1]["number_string"] == hex_float_point_string

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/2793b9f5/test/README.md
----------------------------------------------------------------------
diff --git a/test/README.md b/test/README.md
index 17abf23..ed9e0fc 100644
--- a/test/README.md
+++ b/test/README.md
@@ -8,4 +8,5 @@ To run these, do this in the top level directory:
     $ virtualenv venv
     $ source venv/bin/activate
     $ pip install nose requests
+    $ pip install hypothesis
     $ nosetests

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/2793b9f5/test/literal_gen.py
----------------------------------------------------------------------
diff --git a/test/literal_gen.py b/test/literal_gen.py
deleted file mode 100644
index cf46017..0000000
--- a/test/literal_gen.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# 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.
-
-import random
-from string import digits, hexdigits
-
-def joiner(*items):
-    return ''.join(item() for item in items)
-
-def roll(item, n1, n2=None):
-    n2 = n2 or n1
-    return lambda: ''.join(item() for _ in xrange(random.randint(n1, n2)))
-
-def rand(collection):
-    return lambda: random.choice(collection)
-
-def floating_point_literal():
-    return joiner(roll(rand(' '), 0, 2),
-            roll(rand('+-'), 0, 1),
-            roll(rand(digits), 2, 20),
-            rand('.'),
-            roll(rand(digits), 2, 20),
-            roll(rand('eE'), 1, 1),
-            roll(rand('+-'), 0, 1),
-            roll(rand(digits), 2, 20),
-            roll(rand('fF'), 0, 1),
-            roll(rand(' '), 0, 2))
-
-def hex_floating_point_literal():
-    return joiner(roll(rand(' '), 0, 2),
-            rand('0'),
-            roll(rand('xX'), 1, 1),
-            roll(rand(hexdigits), 1, 6),
-            rand('.'),
-            roll(rand(hexdigits), 1, 7),
-            roll(rand('pP'), 1, 1),
-            roll(rand('+-'), 0, 1),
-            roll(rand(digits), 1, 4),
-            roll(rand('fFdD'), 0, 1),
-            roll(rand(' '), 0, 2))
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/2793b9f5/test/num_string_docs.py
----------------------------------------------------------------------
diff --git a/test/num_string_docs.py b/test/num_string_docs.py
deleted file mode 100644
index f900120..0000000
--- a/test/num_string_docs.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# 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.
-
-import copy
-import literal_gen
-
-
-def setup(db, index_type="view"):
-    db.recreate()
-    DOCS[2]["number_string"] = literal_gen.floating_point_literal()
-    DOCS[3]["number_string"] = literal_gen.hex_floating_point_literal()
-    db.save_docs(copy.deepcopy(DOCS))
-    if index_type == "view":
-        add_view_indexes(db)
-    elif index_type == "text":
-        add_text_indexes(db)
-
-
-def add_text_indexes(db):
-    db.create_text_index()
-
-
-DOCS =  [
-  {
-    "_id": "55118b87283f8f2901c59663",
-    "number_string": "NaN"
-  },
-  {
-    "_id": "55118b873c98123d69bff407",
-    "number_string": "Infinity"
-  },
-  {
-    "_id": "55118b87b4e99951e6fbe5c4",
-    "number_string": "filler"
-  },
-  {
-    "_id": "55118b87bc21952536ef00da",
-    "number_string": "filler"
-  }
-]
\ No newline at end of file