Home | History | Annotate | Download | only in glib
      1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "brillo/glib/object.h"
      6 
      7 #include <gtest/gtest.h>
      8 
      9 #include <algorithm>
     10 #include <cstring>
     11 #include <iterator>
     12 #include <string>
     13 
     14 using brillo::glib::ScopedPtrArray;
     15 using brillo::glib::ScopedError;
     16 using brillo::glib::Retrieve;
     17 using brillo::glib::Value;
     18 using brillo::Resetter;
     19 
     20 namespace {  // NOLINT
     21 
     22 template <typename T>
     23 void SetRetrieveTest(const T& x) {
     24   Value tmp(x);
     25   T result;
     26   EXPECT_TRUE(Retrieve(tmp, &result));
     27   EXPECT_EQ(result, x);
     28 }
     29 
     30 void ModifyValue(Value* x) {
     31   *x = 1.0 / 1231415926.0;   // An unlikely value
     32 }
     33 
     34 template <typename T, typename O>
     35 void MutableRegularTestValue(const T& x, O modify) {
     36   Value tmp(x);
     37   Value y = tmp;  // copy-construction
     38   T result;
     39   EXPECT_TRUE(Retrieve(y, &result));
     40   EXPECT_EQ(result, x);
     41   modify(&y);
     42   LOG(INFO) << "Warning Expected.";
     43   EXPECT_TRUE(!(Retrieve(y, &result) && result == x));
     44   y = tmp;  // assignment
     45   EXPECT_TRUE(Retrieve(y, &result));
     46   EXPECT_EQ(result, x);
     47   modify(&y);
     48   LOG(INFO) << "Warning Expected.";
     49   EXPECT_TRUE(!(Retrieve(y, &result) && result == x));
     50 }
     51 
     52 void OutArgument(int** x) {
     53   *x = new int(10);  // NOLINT
     54 }
     55 
     56 }  // namespace
     57 
     58 TEST(ResetterTest, All) {
     59   scoped_ptr<int> x;
     60   OutArgument(&Resetter(&x).lvalue());
     61   EXPECT_EQ(*x, 10);
     62 }
     63 
     64 TEST(RetrieveTest, Types) {
     65   SetRetrieveTest(std::string("Hello!"));
     66   SetRetrieveTest(static_cast<uint32_t>(10));
     67   SetRetrieveTest(10.5);
     68   SetRetrieveTest(true);
     69 }
     70 
     71 TEST(ValueTest, All) {
     72   Value x;  // default construction
     73   Value y = x;  // copy with default value
     74   x = y;  // assignment with default value
     75   Value z(1.5);
     76   x = z;  // assignment to default value
     77   MutableRegularTestValue(std::string("Hello!"), &ModifyValue);
     78 }
     79 
     80 TEST(ScopedErrorTest, All) {
     81   ScopedError a;  // default construction
     82   ScopedError b(::g_error_new(::g_quark_from_static_string("error"), -1,
     83                               ""));  // constructor
     84   ::GError* c = ::g_error_new(::g_quark_from_static_string("error"), -1,
     85                               "");
     86   ::GError* d = ::g_error_new(::g_quark_from_static_string("error"), -1,
     87                               "");
     88   a.reset(c);  // reset form 1
     89   (void)d;
     90 }
     91 
     92 TEST(ScopedPtrArrayTest, Construction) {
     93   const char item[] = "a string";
     94   char* a = static_cast<char*>(::g_malloc(sizeof(item)));
     95   std::strcpy(a, &item[0]);  // NOLINT
     96 
     97   ::GPtrArray* array = ::g_ptr_array_new();
     98   ::g_ptr_array_add(array, ::gpointer(a));
     99 
    100   ScopedPtrArray<const char*> x(array);
    101   EXPECT_EQ(x.size(), 1);
    102   EXPECT_EQ(x[0], a);  // indexing
    103 }
    104 
    105 TEST(ScopedPtrArrayTest, Reset) {
    106   const char item[] = "a string";
    107   char* a = static_cast<char*>(::g_malloc(sizeof(item)));
    108   std::strcpy(a, &item[0]);  // NOLINT
    109 
    110   ScopedPtrArray<const char*> x;  // default construction
    111   x.push_back(a);
    112   EXPECT_EQ(x.size(), 1);
    113   x.reset();
    114   EXPECT_EQ(x.size(), 0);
    115 
    116   char* b = static_cast<char*>(::g_malloc(sizeof(item)));
    117   std::strcpy(b, &item[0]);  // NOLINT
    118 
    119   ::GPtrArray* array = ::g_ptr_array_new();
    120   ::g_ptr_array_add(array, ::gpointer(b));
    121 
    122   x.reset(array);
    123   EXPECT_EQ(x.size(), 1);
    124 }
    125 
    126 TEST(ScopedPtrArrayTest, Iteration) {
    127   char* a[] = { static_cast<char*>(::g_malloc(1)),
    128       static_cast<char*>(::g_malloc(1)), static_cast<char*>(::g_malloc(1)) };
    129 
    130   ScopedPtrArray<const char*> x;
    131   std::copy(&a[0], &a[3], std::back_inserter(x));
    132   EXPECT_TRUE(std::equal(x.begin(), x.end(), &a[0]));
    133 }
    134 
    135