genericopenlibs/cppstdlib/stl/test/unit/find_test.cpp
changeset 31 ce057bb09d0b
child 34 5fae379060a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cppstdlib/stl/test/unit/find_test.cpp	Fri Jun 04 16:20:51 2010 +0100
@@ -0,0 +1,151 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#include <vector>
+#include <algorithm>
+
+#include "cppunit/cppunit_proxy.h"
+
+#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
+using namespace std;
+#endif
+
+//
+// TestCase class
+//
+class FindTest : public CPPUNIT_NS::TestCase
+{
+  CPPUNIT_TEST_SUITE(FindTest);
+  CPPUNIT_TEST(find0);
+  CPPUNIT_TEST(find1);
+  CPPUNIT_TEST(findif0);
+  CPPUNIT_TEST(findif1);
+  CPPUNIT_TEST(find_char);
+  CPPUNIT_TEST_SUITE_END();
+
+protected:
+  void find0();
+  void find1();
+  void findif0();
+  void findif1();
+  void find_char();
+  static bool odd(int a_);
+  static bool div_3(int a_);
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(FindTest);
+
+//
+// tests implementation
+//
+void FindTest::find0()
+{
+  int numbers[10] = { 0, 1, 4, 9, 16, 25, 36, 49, 64 };
+
+  int *location = find((int*)numbers, (int*)numbers + 10, 25);
+
+  CPPUNIT_ASSERT((location - numbers)==5);
+
+  int *out_range = find((int*)numbers, (int*)numbers + 10, 128);
+
+  CPPUNIT_ASSERT( out_range == (int *)(numbers + 10) );
+}
+
+struct Key
+{
+  int data;
+
+  /* This operator should rather be global and commutative
+     but implementing it this way show that STLport used to
+     ask too much from the user code. */
+  bool operator == (int d) const
+  {
+    return data == d;
+  }
+};
+
+void FindTest::find1()
+{
+  int years[] = { 1942, 1952, 1962, 1972, 1982, 1992 };
+
+  const unsigned yearCount = sizeof(years) / sizeof(years[0]);
+  int* location = find((int*)years, (int*)years + yearCount, 1972);
+
+  CPPUNIT_ASSERT((location - years)==3);
+}
+
+void FindTest::findif0()
+{
+  {
+    int numbers[6] = { 2, 4, 8, 15, 32, 64 };
+    int *location = find_if((int*)numbers, (int*)numbers + 6, odd);
+
+    CPPUNIT_ASSERT((location - numbers)==3);
+
+    int numbers_even[6] = { 2, 4, 8, 16, 32, 64 };
+
+    int *out_range = find_if((int*)numbers_even, (int*)numbers_even + 6, odd);
+
+    CPPUNIT_ASSERT( out_range == (int *)(numbers_even + 6) );
+  }
+
+  {
+    Key keys[10] = { {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} };
+    Key const* k = find(keys + 0, keys + 10, 5);
+    CPPUNIT_ASSERT( k == keys + 10 );
+  }
+}
+
+void FindTest::findif1()
+{
+  typedef vector <int> IntVec;
+  IntVec v(10);
+  for(int i = 0; (size_t)i < v.size(); ++i)
+    v[i] =(i + 1) *(i + 1);
+  IntVec::iterator iter;
+  iter = find_if(v.begin(), v.end(), div_3);
+  CPPUNIT_ASSERT((iter - v.begin())==2);
+}
+
+bool FindTest::odd(int a_)
+{
+  return (a_ % 2) != 0;
+}
+
+bool FindTest::div_3(int a_)
+{
+  return a_ % 3 ? 0 : 1;
+}
+
+void FindTest::find_char()
+{
+  char str[] = "abcdefghij";
+  char *pstr = (char*)str;
+  const char* cpstr = (const char*)str;
+  size_t str_size = sizeof(str) / sizeof(char);
+
+  char *d = find(pstr, pstr + str_size, 'd');
+  CPPUNIT_ASSERT( *d == 'd' );
+
+  const char *e = find(cpstr, cpstr + str_size, 'e');
+  CPPUNIT_ASSERT( *e == 'e' );
+
+  char *last = find(pstr, pstr + str_size, 'x');
+  CPPUNIT_ASSERT( last == pstr + str_size );
+
+  const char *clast = find(cpstr, cpstr + str_size, 'x');
+  CPPUNIT_ASSERT( clast == cpstr + str_size );
+}