Home | History | Annotate | Download | only in tests
      1 // Copyright 2013 The Chromium 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 "mojo/public/cpp/environment/environment.h"
      6 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 
      9 namespace mojo {
     10 namespace {
     11 
     12 struct RedmondRect {
     13   int32_t left;
     14   int32_t top;
     15   int32_t right;
     16   int32_t bottom;
     17 };
     18 
     19 struct RedmondNamedRegion {
     20   std::string name;
     21   std::vector<RedmondRect> rects;
     22 };
     23 
     24 bool AreEqualRectArrays(const Array<test::RectPtr>& rects1,
     25                         const Array<test::RectPtr>& rects2) {
     26   if (rects1.size() != rects2.size())
     27     return false;
     28 
     29   for (size_t i = 0; i < rects1.size(); ++i) {
     30     if (rects1[i]->x != rects2[i]->x ||
     31         rects1[i]->y != rects2[i]->y ||
     32         rects1[i]->width != rects2[i]->width ||
     33         rects1[i]->height != rects2[i]->height) {
     34       return false;
     35     }
     36   }
     37 
     38   return true;
     39 }
     40 
     41 }  // namespace
     42 
     43 template <>
     44 class TypeConverter<test::RectPtr, RedmondRect> {
     45  public:
     46   static test::RectPtr ConvertFrom(const RedmondRect& input) {
     47     test::RectPtr rect(test::Rect::New());
     48     rect->x = input.left;
     49     rect->y = input.top;
     50     rect->width = input.right - input.left;
     51     rect->height = input.bottom - input.top;
     52     return rect.Pass();
     53   }
     54   static RedmondRect ConvertTo(const test::RectPtr& input) {
     55     RedmondRect rect;
     56     rect.left = input->x;
     57     rect.top = input->y;
     58     rect.right = input->x + input->width;
     59     rect.bottom = input->y + input->height;
     60     return rect;
     61   }
     62 };
     63 
     64 template <>
     65 class TypeConverter<test::NamedRegionPtr, RedmondNamedRegion> {
     66  public:
     67   static test::NamedRegionPtr ConvertFrom(const RedmondNamedRegion& input) {
     68     test::NamedRegionPtr region(test::NamedRegion::New());
     69     region->name = input.name;
     70     region->rects = Array<test::RectPtr>::From(input.rects);
     71     return region.Pass();
     72   }
     73   static RedmondNamedRegion ConvertTo(const test::NamedRegionPtr& input) {
     74     RedmondNamedRegion region;
     75     region.name = input->name;
     76     region.rects = input->rects.To<std::vector<RedmondRect> >();
     77     return region;
     78   }
     79 };
     80 
     81 namespace test {
     82 namespace {
     83 
     84 TEST(TypeConversionTest, String) {
     85   const char kText[6] = "hello";
     86 
     87   String a = std::string(kText);
     88   String b(kText);
     89   String c(static_cast<const char*>(kText));
     90 
     91   EXPECT_EQ(std::string(kText), a.To<std::string>());
     92   EXPECT_EQ(std::string(kText), b.To<std::string>());
     93   EXPECT_EQ(std::string(kText), c.To<std::string>());
     94 }
     95 
     96 TEST(TypeConversionTest, String_Null) {
     97   String a;
     98   EXPECT_TRUE(a.is_null());
     99   EXPECT_EQ(std::string(), a.To<std::string>());
    100 
    101   String b = String::From(static_cast<const char*>(NULL));
    102   EXPECT_TRUE(b.is_null());
    103 }
    104 
    105 TEST(TypeConversionTest, String_Empty) {
    106   String a = "";
    107   EXPECT_EQ(std::string(), a.To<std::string>());
    108 
    109   String b = std::string();
    110   EXPECT_FALSE(b.is_null());
    111   EXPECT_EQ(std::string(), b.To<std::string>());
    112 }
    113 
    114 TEST(TypeConversionTest, StringWithEmbeddedNull) {
    115   const std::string kText("hel\0lo", 6);
    116 
    117   String a(kText);
    118   EXPECT_EQ(kText, a.To<std::string>());
    119 
    120   // Expect truncation:
    121   String b(kText.c_str());
    122   EXPECT_EQ(std::string("hel"), b.To<std::string>());
    123 }
    124 
    125 TEST(TypeConversionTest, CustomTypeConverter) {
    126   RectPtr rect(Rect::New());
    127   rect->x = 10;
    128   rect->y = 20;
    129   rect->width = 50;
    130   rect->height = 45;
    131 
    132   RedmondRect rr = rect.To<RedmondRect>();
    133   EXPECT_EQ(10, rr.left);
    134   EXPECT_EQ(20, rr.top);
    135   EXPECT_EQ(60, rr.right);
    136   EXPECT_EQ(65, rr.bottom);
    137 
    138   RectPtr rect2(Rect::From(rr));
    139   EXPECT_EQ(rect->x, rect2->x);
    140   EXPECT_EQ(rect->y, rect2->y);
    141   EXPECT_EQ(rect->width, rect2->width);
    142   EXPECT_EQ(rect->height, rect2->height);
    143 }
    144 
    145 TEST(TypeConversionTest, CustomTypeConverter_Array_Null) {
    146   Array<RectPtr> rects;
    147 
    148   std::vector<RedmondRect> redmond_rects =
    149       rects.To<std::vector<RedmondRect> >();
    150 
    151   EXPECT_TRUE(redmond_rects.empty());
    152 }
    153 
    154 TEST(TypeConversionTest, CustomTypeConverter_Array) {
    155   const RedmondRect kBase = { 10, 20, 30, 40 };
    156 
    157   Array<RectPtr> rects(10);
    158   for (size_t i = 0; i < rects.size(); ++i) {
    159     RedmondRect rr = kBase;
    160     rr.left += static_cast<int32_t>(i);
    161     rr.top += static_cast<int32_t>(i);
    162     rects[i] = Rect::From(rr);
    163   }
    164 
    165   std::vector<RedmondRect> redmond_rects =
    166       rects.To<std::vector<RedmondRect> >();
    167 
    168   Array<RectPtr> rects2 = Array<RectPtr>::From(redmond_rects);
    169   EXPECT_TRUE(AreEqualRectArrays(rects, rects2));
    170 }
    171 
    172 TEST(TypeConversionTest, CustomTypeConverter_Nested) {
    173   RedmondNamedRegion redmond_region;
    174   redmond_region.name = "foopy";
    175 
    176   const RedmondRect kBase = { 10, 20, 30, 40 };
    177 
    178   for (size_t i = 0; i < 10; ++i) {
    179     RedmondRect rect = kBase;
    180     rect.left += static_cast<int32_t>(i);
    181     rect.top += static_cast<int32_t>(i);
    182     redmond_region.rects.push_back(rect);
    183   }
    184 
    185   // Round-trip through generated struct and TypeConverter.
    186 
    187   NamedRegionPtr copy = NamedRegion::From(redmond_region);
    188   RedmondNamedRegion redmond_region2 = copy.To<RedmondNamedRegion>();
    189 
    190   EXPECT_EQ(redmond_region.name, redmond_region2.name);
    191   EXPECT_EQ(redmond_region.rects.size(), redmond_region2.rects.size());
    192   for (size_t i = 0; i < redmond_region.rects.size(); ++i) {
    193     EXPECT_EQ(redmond_region.rects[i].left, redmond_region2.rects[i].left);
    194     EXPECT_EQ(redmond_region.rects[i].top, redmond_region2.rects[i].top);
    195     EXPECT_EQ(redmond_region.rects[i].right, redmond_region2.rects[i].right);
    196     EXPECT_EQ(redmond_region.rects[i].bottom, redmond_region2.rects[i].bottom);
    197   }
    198 }
    199 
    200 }  // namespace
    201 }  // namespace test
    202 }  // namespace mojo
    203