00001
00002
00003 #include <cppscript>
00004 #include <dynamic/extensions.hpp>
00005 #include <sstream>
00006
00007 #include "unit_tests.hpp"
00008
00009
00010 namespace
00011 {
00012 var str_clear(var self)
00013 {
00014 self["object"].as<std::string>().clear();
00015 return self;
00016 }
00017
00018 var str_get(var self)
00019 {
00020 return self["object"].as<std::string>();
00021 }
00022
00023 var str_create(var str)
00024 {
00025 return object().extend
00026 ("object", create<std::string>(str.as_string()))
00027 ("get", str_get)
00028 ("clear", str_clear);
00029 }
00030 }
00031
00032
00033 class my_var_impl : public var_impl
00034 {
00035 public:
00036 void copy_to(void*p) const { new(p) my_var_impl(*this); }
00037
00038 std::string class_name() { return "my_var_impl"; }
00039
00040 int as_int() { return 5; }
00041 };
00042
00043
00044 class my_shared_var_impl : public shared_var_impl
00045 {
00046 public:
00047 std::string class_name() { return "my_shared_var_impl"; }
00048
00049 int as_int() { return 6; }
00050
00051 void mark_children(gc::garbage_collector&) { }
00052 };
00053
00054
00055 void test_native()
00056 {
00057
00058 var str = create<std::string>(std::string("Boo"));
00059 var empty_str = create<std::string>();
00060
00061
00062 assert( str.impl().shared_var() );
00063 assert( str.class_name() == "native" );
00064 assert( str != null );
00065 assert( str == str );
00066 assert( str == +str );
00067 assert_throws( not_supported, str() );
00068 assert_throws( not_supported, pickle(str) );
00069 assert( str.impl().comparison_index() == cmp_native );
00070 assert( str > bind( str_clear, var() ) );
00071 assert( str.max_args() == -1 );
00072
00073
00074
00075 assert( str.as<std::string>() == "Boo" );
00076
00077 assert( !str.as_string().empty() );
00078 assert( !str.as_wstring().empty() );
00079
00080 assert( !str );
00081 assert( str.as_int() == 0 );
00082 assert( str.as_double() == 0.0 );
00083
00084
00085 assert_throws( not_supported, str.as<int>() );
00086
00087 test_default_container( str );
00088 test_default_iterator( str );
00089 test_default_assignment( str );
00090
00091
00092 test_default_operators( str );
00093
00095 var dumb_str = str_create("Foo");
00096 assert( dumb_str["get"]() == "Foo" );
00097 dumb_str["clear"]();
00098 assert( dumb_str["get"]() == "" );
00099
00100
00101
00102 var str2 = +str;
00103 str.as<std::string>() = "shoe";
00104 assert( str2.as<std::string>() == "shoe" );
00105
00106
00107 assertx( create_impl(my_var_impl()).as_int() == 5 );
00108
00109
00110 assertx( var(new my_shared_var_impl()).as_int() == 6 );
00111 }
00112
00113
00114 void test_stream()
00115 {
00116 std::ostringstream ss;
00117 ss << var("fu") << var(2);
00118 assert( ss.str() == "fu2" );
00119 }
00120
00121
00122 void test_gc()
00123 {
00124 {
00125 var v1 = array();
00126 v1[0] = v1;
00127 }
00128
00129 gc_force_collect();
00130 int init_object_count = gc::global_gc().object_count();
00131 gc_force_collect();
00132 assert(gc::global_gc().object_count() == init_object_count);
00133
00134 {
00135 var o = array();
00136 for(int i=0; i<10000; ++i)
00137 {
00138 o[i] = i+1;
00139 }
00140 }
00141
00142 gc_force_collect();
00143 assert(gc::global_gc().object_count() == init_object_count);
00144
00145
00146 {
00147 gc_disable();
00148 finally( gc_enable );
00149
00150 init_object_count = gc::global_gc().object_count();
00151 {
00152 var o = array();
00153 for(int i=0; i<10000; ++i)
00154 {
00155 o[i] = i+1;
00156 }
00157 }
00158 int count = gc::global_gc().object_count();
00159 gc_hint_collect();
00160 assert( gc::global_gc().object_count() == count );
00161 }
00162
00163 }
00164
00165
00166 void test_global()
00167 {
00168
00169
00170 var g = global();
00171
00172
00173 global()["hw"] = 12;
00174 global()["x"] = object();
00175 global()["x"]["y"] = "fu";
00176
00177 assert( global()["hw"] == 12 );
00178 assert( global()["x"]["y"].as_string() == "fu" );
00179 }