[Groonga-commit] groonga/grnxx at feff7a9 [master] Add a test for NaN in sorting.

Back to archive index

susumu.yata null+****@clear*****
Thu Aug 21 12:02:17 JST 2014


susumu.yata	2014-08-21 12:02:17 +0900 (Thu, 21 Aug 2014)

  New Revision: feff7a972687b51cb13ef627da55b3d777947aad
  https://github.com/groonga/grnxx/commit/feff7a972687b51cb13ef627da55b3d777947aad

  Message:
    Add a test for NaN in sorting.

  Modified files:
    test/test_sorter.cpp

  Modified: test/test_sorter.cpp (+28 -6)
===================================================================
--- test/test_sorter.cpp    2014-08-21 10:37:55 +0900 (f0ee048)
+++ test/test_sorter.cpp    2014-08-21 12:02:17 +0900 (4889796)
@@ -83,8 +83,12 @@ void init_test() {
   for (grnxx::Int i = 1; i <= NUM_ROWS; ++i) {
     test.bool_values.set(i, (mersenne_twister() & 1) != 0);
     test.int_values.set(i, mersenne_twister() % 100);
-    constexpr auto MAX_VALUE = mersenne_twister.max();
-    test.float_values.set(i, 1.0 * mersenne_twister() / MAX_VALUE);
+    if ((mersenne_twister() % 16) == 0) {
+      test.float_values.set(i, std::numeric_limits<grnxx::Float>::quiet_NaN());
+    } else {
+      constexpr auto MAX_VALUE = mersenne_twister.max();
+      test.float_values.set(i, 1.0 * mersenne_twister() / MAX_VALUE);
+    }
     grnxx::Int length =
         (mersenne_twister() % (MAX_LENGTH - MIN_LENGTH)) + MIN_LENGTH;
     test.text_bodies[i].resize(length);
@@ -262,6 +266,24 @@ void test_int() {
   }
 }
 
+struct LessEqual {
+  bool operator()(grnxx::Float lhs, grnxx::Float rhs) const {
+    // Numbers are prior to NaN.
+    if (std::isnan(rhs)) {
+      return true;
+    } else if (std::isnan(lhs)) {
+      return false;
+    }
+    return lhs <= rhs;
+  }
+};
+
+struct Equal {
+  bool operator()(grnxx::Float lhs, grnxx::Float rhs) const {
+    return (lhs == rhs) || (std::isnan(lhs) && std::isnan(rhs));
+  }
+};
+
 void test_float() {
   grnxx::Error error;
 
@@ -292,7 +314,7 @@ void test_float() {
     grnxx::Int rhs_row_id = records.get_row_id(i);
     grnxx::Float lhs_value = test.float_values[lhs_row_id];
     grnxx::Float rhs_value = test.float_values[rhs_row_id];
-    assert(lhs_value <= rhs_value);
+    assert(LessEqual()(lhs_value, rhs_value));
   }
 
   // Create a reverse sorter.
@@ -310,7 +332,7 @@ void test_float() {
     grnxx::Int rhs_row_id = records.get_row_id(i);
     grnxx::Float lhs_value = test.float_values[lhs_row_id];
     grnxx::Float rhs_value = test.float_values[rhs_row_id];
-    assert(lhs_value >= rhs_value);
+    assert(LessEqual()(rhs_value, lhs_value));
   }
 
   // Create a multiple order sorter.
@@ -333,8 +355,8 @@ void test_float() {
     grnxx::Int rhs_row_id = records.get_row_id(i);
     grnxx::Float lhs_value = test.float_values[lhs_row_id];
     grnxx::Float rhs_value = test.float_values[rhs_row_id];
-    assert(lhs_value <= rhs_value);
-    if (lhs_value == rhs_value) {
+    assert(LessEqual()(lhs_value, rhs_value));
+    if (Equal()(lhs_value, rhs_value)) {
       assert(lhs_row_id < rhs_row_id);
     }
   }
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index